如何使 QLineEdit 跟随光标向我显示它的坐标

Posted

技术标签:

【中文标题】如何使 QLineEdit 跟随光标向我显示它的坐标【英文标题】:How to make a QLineEdit follow the cursor to show me its coordinates 【发布时间】:2014-08-20 12:27:35 【问题描述】:

我希望我的QWidget 在图像上显示光标的坐标,我读到最好的方法是使用QLineEdit,但我没有找到如何使用它。如何启动QLineEdit 以及如何显示它,以便它跟随光标? PS:我知道如何在上面设置点坐标。 我就是这样做的:

void QImageWidget::mouseMoveEvent( QMouseEvent *event )
   int x = event->pos( ).x();
   int y = event->pos( ).y();
   if( cursorLineEdit != NULL && cursorLineEdit->isEnabled( ) )
       cursorLineEdit->setText( QString( "[ %1 , %2 ]" ).arg( x ).arg( y ) );

mouseTracking 已经设置为 true :

this->setMouseTracking(true);

谢谢!

编辑: cursorLineEdit 是我要显示的 QLineEdit,我需要在我的 QWidget 构造函数上初始化它,但我不知道如何!

【问题讨论】:

什么实际上不起作用?什么是cursorLineEdit,它是如何声明、创建和初始化的? 您需要在小部件上激活mouse tracking 它已经激活了,我只是不知道如何启动QLineEdit,他的父母会是什么??以及如何展示它! cursorLineEdit是QLineEdit,是我的QImageWidget(QWidget)的一个属性,不知道怎么初始化 【参考方案1】:

您可以执行以下操作:

QImageWidget::QImageWidget()

    [..]
    cursorLineEdit = new QLineEdit(this);
    QVBoxLayout layout = new QVBoxLayout(this);
    layout->addWidget(cursorLineEdit);
    setMouseTracking(true);
    [..]

void QImageWidget::mouseMoveEvent( QMouseEvent *event )

   int x = event->pos().x();
   int y = event->pos().y();
   if (cursorLineEdit->isEnabled())
       cursorLineEdit->setText(QString( "[ %1 , %2 ]" ).arg( x ).arg( y ) );

编辑:

另一种方法是显示带有坐标的工具提示:

void QImageWidget::mouseMoveEvent(QMouseEvent *event)

    const QPoint &p = event->pos();
    QToolTip::showText(mapToGlobal(p),
                       QString("[%1 , %2]").arg(p.x()).arg(p.y()), this,
                       QRect(p, QSize(20, 20)));

【讨论】:

感谢您的回答,它显示的是 QLineEdit,但这不是我真正要求的,因为我实际上需要在光标附近显示它(并且它必须跟随它) @user3883676,我认为 QLineEdit 不是正确的选择。我建议改用工具提示。 你可能是对的,我实际上看到了这个:***.com/questions/12417636/qt-show-mouse-position-like-tooltip 那个问的人说他使用了 QLineEdit 等更好,这就是我来问的原因,但我会尝试一个工具提示,谢谢! @user3883676,我已经用实现工具提示版本的示例代码修改了我的答案。【参考方案2】:

我找到了另一种解决方案,但首先我想告诉你,为什么我决定在这里发布我的答案。我认为我的解决方案效率不高而且非常负载 CPU,但是当我运行 vahancho 的代码时,我看到 QToolTip 也加载了 CPU(在我的计算机上,两种解决方案都可以将 CPU 从 0% 加载到 3%)所以现在我认为我可以在这里发布答案你可以决定你想使用什么。

想法:获取位置,创建透明像素图,在此像素图坐标上绘制,将此像素图设置为光标。此外,我们将使用一个 bool 变量(我们不会在每次 mouseMoveEvent 时都绘制像素图,而是每隔一次绘制一次(为了效率))

bool showMustGoOn;//in header

showMustGoOn = false;//in constructor

void QImageWidget::mouseMoveEvent(QMouseEvent *event)

    if(showMustGoOn)
    
    const QPoint &p = event->pos();
    QPixmap px(50,10);
    px.fill(Qt::transparent);
    QPainter paint(&px);
    paint.drawText(10,10,QString("%1,%2").arg(p.x()).arg(p.y()));
    setCursor(QCursor(px));
    showMustGoOn = false;
    
    else
    
        showMustGoOn = true;
    

如果你想使用它,你可以画另一个东西来显示光标。另一个优点是像素图是透明的,所以这个光标不会关闭另一个区域(你看到的只是数字,其他都是透明的,但工具提示关闭)

最后,在 Qwt 中也有类似的东西,我认为它更有效,但是在 Qwt 的源代码中搜索所需的代码可能会很长而且很复杂。

【讨论】:

以上是关于如何使 QLineEdit 跟随光标向我显示它的坐标的主要内容,如果未能解决你的问题,请参考以下文章

如何使底部按钮跟随 SwiftUI 中的键盘显示

AngularJS:让元素跟随光标

c# winform中如何实现跟随光标的放大镜

如何使 QPushButtons 将文本添加到 QLineEdit 框中?

WPF中RichTextBox的定位问题。如何使光标定位到与指定关键字所在的位置?

如何使 Pyqt5 QLineEdit 只接受数字