【发布时间】:2009-10-17 21:01:05
【问题描述】:
我想在QPlainTextEdit 中的文本光标位置执行QMenu 对象。我的问题是 QTextCursor 仅由其在文本中的位置(字符索引)定义。
如何找到QTextCursor 的全局位置?我是否应该使用除QTextCursor 之外的其他对象来查找要打开QMenu 的文本光标的位置?
提前谢谢你。
【问题讨论】:
我想在QPlainTextEdit 中的文本光标位置执行QMenu 对象。我的问题是 QTextCursor 仅由其在文本中的位置(字符索引)定义。
如何找到QTextCursor 的全局位置?我是否应该使用除QTextCursor 之外的其他对象来查找要打开QMenu 的文本光标的位置?
提前谢谢你。
【问题讨论】:
我自己从未尝试过,但QPlainTextEdit::cursorRect() 不起作用吗?它应该为您提供光标在视口坐标中的位置。然后您可以使用viewport() 获取视口,并使用viewport()->mapToGlobal() 将本地位置映射到全局。
【讨论】:
editor->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 开发库,而不仅仅是运行时。代码包含两个文件,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
【讨论】: