我希望我的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构造函数上初始化它,但我不知道怎么做!
答案 0 :(得分:2)
您可以执行以下操作:
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)));
}
答案 1 :(得分:1)
我找到了另一个解决方案,但首先我想告诉你,为什么我决定在这里发布我的答案。我认为我的解决方案不高效并且非常加载CPU,但是当我运行vahancho的代码时,我看到QToolTip也加载了CPU(在我的计算机上,两个解决方案都可以将CPU从0加载到3%)所以现在我认为我可以在这里发布答案,你可以决定你想要使用什么。
想法:获取位置,创建透明像素图,在此像素图坐标上绘制,将此像素图设置为光标。而且,我们将使用一个bool变量(我们不会在每个mouseMoveEvent中绘制pixmap,我们将每隔一次绘制它(为了效率))
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;
}
}
如果你想使用它,你可以画另一个来显示光标。另一个优点是pixmap是透明的,所以这个光标不会关闭另一个区域(你只看到数字,所有另一个是透明的,但工具提示关闭)
最后,在Qwt中有类似的东西,我认为它更有效,但在Qwt的源代码中搜索所需的代码可能会很长并且复杂。