如何找到文本光标的全局位置?
Posted
技术标签:
【中文标题】如何找到文本光标的全局位置?【英文标题】:How to find global position of text cursor? 【发布时间】:2009-10-17 21:01:05 【问题描述】:我想在QPlainTextEdit
中的文本光标位置执行QMenu
对象。我的问题是 QTextCursor
仅由其在文本中的位置(字符索引)定义。
如何找到QTextCursor
的全局位置?我是否应该使用除QTextCursor
之外的其他对象来查找要打开QMenu
的文本光标的位置?
提前谢谢你。
【问题讨论】:
【参考方案1】:我自己从未尝试过,但QPlainTextEdit::cursorRect()
不起作用吗?它应该为您提供光标在视口坐标中的位置。然后您可以使用viewport()
获取视口,并使用viewport()->mapToGlobal()
将本地位置映射到全局。
【讨论】:
cursorRect 返回光标在 QPlainTextEdit 中的相对位置,而我需要全局位置,因为它存在于 QCursor 中。 好吧,我希望你知道editor->viewport()->mapToGlobal()
:)【参考方案2】:
我在一些在线论坛中发现了与您类似的查询,有人建议输出为
注意:参考来自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。
十字准线.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 继承更复杂的了,将计时器设置为每秒运行 20 次,获取当前光标坐标并将它们写入标签的文本中。在窗口中单击将其关闭。我在布局对象时使用它来修复 javascript 中的对齐错误。
您可以在 Crosshair 类的构造函数中打开一个文件来存储您的数据,并使用 gettimeofday(2) 获取时间戳。没有说 Qt 必须在 GUI 模式下运行(你可以明确告诉它不要在 QApplication 构造函数中)。
来自奇趣科技的 Qt:http://doc.trolltech.com
【讨论】:
我知道如何跟踪鼠标光标位置。我需要跟踪文本光标位置。无论如何感谢您的帮助以上是关于如何找到文本光标的全局位置?的主要内容,如果未能解决你的问题,请参考以下文章