2009-10-17 4 views
7

Я хотел бы выполнить объект QMenu в позиции текстового курсора в QPlainTextEdit. Моя проблема заключается в том, что QTextCursor определяет только его положение в тексте (индекс символа).Как найти глобальную позицию текстового курсора?

Как найти глобальное положение QTextCursor? Должен ли я использовать другой объект, кроме QTextCursor, чтобы найти позицию текстового курсора, где я хочу открыть мой QMenu?

спасибо заранее.

ответ

8

Я никогда не пробовал себя, но не QPlainTextEdit::cursorRect() работы? Он должен дать вам положение курсора в координатах видового экрана. Затем вы можете получить окно просмотра с помощью viewport() и отобразить локальную позицию в глобальную, используя viewport()->mapToGlobal().

+0

cursorRect возвращает относительное положение курсора в QPlainTextEdit в то время как мне нужно глобальное положение, как она существует для QCursor. –

+1

Ну, я ожидал, что вы знаете о 'editor-> viewport() -> mapToGlobal()' :) –

+0

Я этого не знал. Он работает нормально. Спасибо –

0

Я нашел подобный запрос к вашему в некоторых онлайн-форуме и вот кто-то предложил выход как

Примечание: Reference из http://www.unix.com/unix-linux-applications/81388-read-position-mouse-cursor.html, автор ниже регистраци daggilli, зарегистрированный пользователь UNIX интернет-форумах. Кредит ниже размещения в его полной форме относится к daggilli.

Это полный код приложения Qt, который я сбрасывал примерно через десять минут (называемый перекрестием), который отображает текущие координаты мыши в окне. Вы могли бы вытащить достаточно, чтобы быть полезными. Это Qt 3.1, но Qt 4 не сильно отличается. Вам понадобятся библиотеки разработки Qt, а не только время выполнения. Код содержит два файла: crosshair.h и crosshair.cpp.

crosshair.h:

Код:

#ifndef CROSSHAIR_H 
#define CROSSHAIR_H 
#include <qwidget.h> 
#include <qstring.h> 
#include <qlabel.h> 
#include <qevent.h> 

class Crosshair : public QLabel 
{ 
Q_OBJECT 

public: 
    Crosshair(QWidget *parent=0); 

protected: 
    void mousePressEvent(QMouseEvent *); 

private: 
    QTimer   *timer; 

private slots: 
    void timerfire(); 
}; 

#endif 

crosshair.cpp:

Код:

#include <qapplication.h> 
#include <qpushbutton.h> 
#include <qtimer.h> 
#include <qcursor.h> 
#include <iostream> 
#include "crosshair.h" 

using namespace std; 

int main(int argc,char **argv) 
{ 
    QApplication a(argc,argv); 

    Crosshair mousepos; 

    a.setMainWidget(&mousepos); 
    mousepos.show(); 
    return a.exec(); 
} 

Crosshair::Crosshair(QWidget *parent) : QLabel(parent) 
{ 
    setIndent(20); 
    resize(100,30); 
    move(1200,200); 
    setText("0,0"); 
    timer=new QTimer(this); 
    connect(timer,SIGNAL(timeout()),this,SLOT(timerfire())); 
    timer->start(50,false); 
} 

void Crosshair::mousePressEvent(QMouseEvent *) 
{ 
    qApp->quit(); 
} 

void Crosshair::timerfire() 
{ 
    QPoint p=QCursor::pos(); 
    this->setText(QString().sprintf("%d,%d",p.x(),p.y())); 
} 

Для создания этого поместите оба файла в каталог с именем перекрестие , перейдите в этот каталог и введите Код:

qmake -project 
qmake 
make 

Это не делает ничего более сложного, чем наследовать от QLabel, установить таймер для запуска 20x второй, захватить текущие координаты курсора и записать их в текст этикетки. Щелчок в окне закрывает его. Я использую его для исправления ошибок выравнивания в JavaScript, когда я выкладываю объекты.

Вы можете открыть файл в конструкторе класса Crosshair для хранения ваших данных и использовать gettimeofday (2), чтобы получить метку времени. Ничто не говорит о том, что Qt должен запускаться в режиме графического интерфейса (вы можете явно сказать это не в конструкторе QApplication).

Qt от Trolltech: http://doc.trolltech.com

+0

Я знаю, как позиция курсора мыши курсора. Мне нужно отслеживать положение текстового курсора. Спасибо за вашу помощь в любом случае –

Смежные вопросы