在Qt中如何检测工具提示内的鼠标单击事件?

3
我有一个 Qt 应用程序,在特定的内部条件发生时,会显示某些 QLabel 的工具提示。
由于工具提示有超时并且被 Qt 自动隐藏,因此应用程序通过每 3 秒显示一次工具提示来保持工具提示的存在(我没有找到任何机制告诉 Qt 无限期显示工具提示)。
工具提示会一直显示,直到用户单击 QLabel 本身:工具提示不再刷新并消失。
现在我有一个新的要求,即如果用户单击工具提示本身,则工具提示也应消失。是否有一个信号是在用户单击可见的工具提示时发送的?还是需要使用一些更复杂的技术?
编辑
我再次检查了我的代码,这里有一些额外的信息。
Qt 确实检测到在工具提示上的鼠标点击并将其隐藏,但应用程序立即再次显示工具提示。
我想做的是让 Qt 通知我的代码鼠标单击事件,以便它停止反复显示工具提示。我有两种可能的解决方案,但我不知道它们中的任何一个是否在技术上可行:
1.移除工具提示超时: 当显示工具提示时,只要用户不单击它,它就会一直可见。如何在 Qt 中显示没有超时的提示?
2.通过重复显示工具提示来保持工具提示可见;检测鼠标在工具提示上的单击,以停止保持活动循环。当用户单击工具提示时,我如何接收信号?
2个回答

6

实际上实现工具提示的类是一个称为QTipLabel的私有QLabel衍生类:

http://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/kernel/qtooltip.cpp#line119

在QToolTip中没有公开的接口可以获取该类的实例,因此拦截点击只能通过某种不良建议的黑客方式完成。

话虽如此:应“hideTipImmediately”的事件之一是QEvent::mouseButtonPress...实际上,安装了事件过滤器以便于在应用程序中的任何点击都会隐藏它:

http://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/kernel/qtooltip.cpp#line325

因此,如果您在单击时没有看到工具提示消失,则存在错误。(在基于Qt的Kubuntu应用程序中,单击工具提示会将其隐藏。)


非常感谢!我会检查应用程序中是否有鼠标点击被过滤,导致工具提示无法消失。 - Giorgio

1
请注意QToolTip::showText的定义:

void QToolTip::showText ( const QPoint & pos, const QString & text, QWidget * w, const QRect & rect ) [static] 显示文本作为工具提示,以全局位置pos作为兴趣点。工具提示将显示为与此兴趣点的平台特定偏移量。

如果指定了非空矩形,则在将光标移出该区域后,提示将被隐藏。

矩形位于您使用w指定的小部件的坐标中。如果矩形不为空,则必须指定一个小部件。否则,此参数可以为0,但用于确定多头系统上的适当屏幕。

如果文本为空,则工具提示将被隐藏。如果文本与当前显示的工具提示相同,则提示不会移动。您可以通过首先使用空文本隐藏提示,然后在新位置显示新提示来强制移动。

因此,您可以提供要显示QToolTip的矩形。然后,如果您想要的是仅在用户单击时关闭QToolTip,则可以像@HostileFork指出的那样捕获mouseButtonPress事件,然后仅在事件坐标落在其中时关闭工具提示。

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