Как найти глобальную позицию текстового курсора?

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

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

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

2 ответов


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


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

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

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

перекрестие.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

перекрестие.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()));
}

чтобы построить это, поместите оба файлы в каталоге под названием crosshair. CD в этот каталог и введите Код:

qmake -project
qmake
make

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

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

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