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

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

【讨论】:

我知道如何跟踪鼠标光标位置。我需要跟踪文本光标位置。无论如何感谢您的帮助

以上是关于如何找到文本光标的全局位置?的主要内容,如果未能解决你的问题,请参考以下文章

获取文本输入字段中的光标位置(以字符为单位)

如何在 C# 的富文本框中将文本添加到用户光标的位置?

如何在占位符文本上启动光标位置中心反应原生?

如何在 UITextView 中找到光标的位置

如何在 Windows 中确定文本光标位置

编辑文本 - 如何更改光标位置?