我想在QMenu
中的文本光标位置执行QPlainTextEdit
对象。我的问题是QTextCursor
只能通过它在Text中的位置(角色的索引)来定义。
如何找到QTextCursor
的全球排名?我应该使用QTextCursor
以外的其他对象来查找文本光标在我要打开QMenu
的位置吗?
先谢谢你。
答案 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