当鼠标悬停在QGraphicsItem上时,QToolTip应该跟随鼠标移动,但出现了奇怪的行为

3
我有一个显示QGraphicsScene的QGraphicsView,其中包含一个QGraphicsItem。我的项目实现了hoverMoveEvent(...)方法,触发了一个QToolTip。我希望当鼠标在该项上移动时,工具提示会跟随鼠标移动。但是只有两种情况下才能实现:
1.创建两个QToolTips,其中第一个是虚拟的,并立即被第二个覆盖。
2.或者,使提示的内容随机,例如将rand()放入其文本中。
然而,这种实现并不像应该的那样工作。它让工具提示出现,但它不跟随鼠标移动。就好像它意识到它的内容没有改变,也不需要任何更新。
void MyCustomItem::hoverMoveEvent(QGraphicsSceneHoverEvent *mouseEvent)
{
    QToolTip::showText(mouseEvent->screenPos(), "Tooltip that follows the mouse");
}

这段代码可以实现预期的功能,即提示框会跟随鼠标移动。缺点是,由于创建了两个提示框,所以可能会出现轻微闪烁。

 void MyCustomItem::hoverMoveEvent(QGraphicsSceneHoverEvent *mouseEvent)
    {
QToolTip::showText(mouseEvent->screenPos(), "This is not really shown and is just here to make the second tooltip follow the mouse.");
        QToolTip::showText(mouseEvent->screenPos(), "Tooltip that follows the mouse");
    }

第三种解决方案是在这里提出的,也可以使用。然而,我不想显示坐标。提示框的内容是静态的...

如何使这个工作正常,而不必创建两个提示框或者更新提示框的位置,以避免上述描述的闪烁问题?

1个回答

3

QTooltip 旨在在您移动鼠标时消失,如果不希望出现这种行为,可以使用 QLabel 并启用 Qt::ToolTip 标志。 对于您的情况:

.h

private:
    QLabel *label;

.cpp

MyCustomItem::MyCustomItem(QGraphicsItem * parent):QGraphicsItem(parent)
{
    label = new QLabel;
    label->setWindowFlag(Qt::ToolTip);
    [...]
}

在你想要显示消息的位置,例如在 hoverMoveEvent 中,你应该放置以下代码:

label->move(event->screenPos());
label->setText("Tooltip that follows the mouse");
if(label->isHidden())
    label->show();

如果想要隐藏它,你需要使用:

label->hide();

请查看:如何使QToolTip消息持久化?


谢谢,这个可以完成任务。一个重要的补充是:标签的位置应该略低于 screenPos()。否则,如果你向下移动鼠标,鼠标会落在标签上并离开项目。auto pos = event->screenPos(); pos += {0, 20}; - dani
这可能会放在您的帖子中,因为它是您应用程序的非常特定的事情,:D ,如果我的答案有所帮助,请将其标记为正确。 - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接