【问题标题】:How to find global position of text cursor?如何找到文本光标的全局位置?
【发布时间】:2009-10-17 21:01:05
【问题描述】:

我想在QPlainTextEdit 中的文本光标位置执行QMenu 对象。我的问题是 QTextCursor 仅由其在文本中的位置(字符索引)定义。

如何找到QTextCursor 的全局位置?我是否应该使用除QTextCursor 之外的其他对象来查找要打开QMenu 的文本光标的位置?

提前谢谢你。

【问题讨论】:

    标签: qt qt4


    【解决方案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

    【讨论】:

    • 我知道如何跟踪鼠标光标位置。我需要跟踪文本光标位置。无论如何感谢您的帮助
    猜你喜欢
    • 2010-10-06
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多