如何找到文本光标的全局位置?

时间:2009-10-17 21:01:05

标签: qt qt4

我想在QMenu中的文本光标位置执行QPlainTextEdit对象。我的问题是QTextCursor只能通过它在Text中的位置(角色的索引)来定义。

如何找到QTextCursor的全球排名?我应该使用QTextCursor以外的其他对象来查找文本光标在我​​要打开QMenu的位置吗?

先谢谢你。

2 个答案:

答案 0 :(得分:8)

我从未尝试过自己,但QPlainTextEdit::cursorRect()没有工作?它应该在视口坐标中给出光标的位置。然后,您可以使用viewport()获取视口,并使用viewport()->mapToGlobal()将本地位置映射到全局。

答案 1 :(得分:0)

我在一些在线论坛上找到了类似的查询,这里有人建议输出为

注意:来自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()));
}

要构建它,请将两个文件放在名为crosshair的目录中。 cd到该目录并键入 代码:

qmake -project
qmake
make

这比从QLabel继承更复杂,设置定时器每秒运行20x,抓取当前光标坐标并将它们写入标签的文本。单击窗口关闭它。当我布置对象时,我用它来修复JavaScript中的对齐错误。

您可以在Crosshair类的构造函数中打开一个文件来存储数据,并使用gettimeofday(2)来获取时间戳。没有什么说Qt必须在GUI模式下运行(你可以在QApplication构造函数中明确告诉它)。

来自奇趣科技的Qt:http://doc.trolltech.com