如何在Qt的工具提示中检测鼠标点击



我有一个Qt应用程序,其中某些QLabel的显示一个工具提示,如果某个内部条件发生

由于工具提示有一个超时并且被Qt自动隐藏,工具提示通过每3秒显示一次工具提示而被应用程序保持活跃(我没有找到任何机制来告诉Qt无限期地显示工具提示)。

工具提示一直显示到用户单击QLabel本身:工具提示不再刷新并消失。

我现在有一个新的要求,如果用户单击工具提示本身,工具提示也应该消失。当用户单击一个可见的工具提示时,是否会发送一个信号?还是有必要使用一些更复杂的技术?

编辑

我再次检查了我的代码,这里是一些额外的信息。

Qt检测到鼠标点击工具提示并隐藏它,但应用程序立即再次显示工具提示。我想做的是Qt通知我的代码鼠标单击事件,这样它就会停止一次又一次地显示工具提示。我心中有两个可能的解决方案,但我不知道它们中的任何一个在技术上是否可行:

  1. 删除工具提示超时:当工具提示显示时,只要用户不点击它,它就保持可见。如何在Qt中显示没有超时的工具提示?
  2. 通过反复显示工具提示来保持它的可见性;检测鼠标单击工具提示以停止keep-alive循环。当用户单击工具提示时,我如何接收信号?

在底层,实现工具提示的实际类是一个私有的qlabel派生类,称为QTipLabel:

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

在接口中没有发布任何东西可以从QToolTip获取该类的实例,所以拦截点击只能通过某种不明智的黑客来完成。

也就是说:应该"立即隐藏"的事件是QEvent::mouseButtonPress…事实上,有一个事件过滤器安装,所以任何在应用程序中的点击将隐藏它:

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

所以如果你在点击工具提示时没有看到它消失,那就有bug了。(点击工具提示会在Kubuntu下基于qt的应用程序中为我隐藏它们)

注意QToolTip::showText:

的定义

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

如果您指定了一个非空的rect,提示将被隐藏将光标移出此区域。

矩形位于您用w. If指定的小部件的坐标中rect不是空的,必须指定一个小部件。否则这参数可以为0,但它用于确定适当的屏幕在多头系统上。

如果文本为空,则隐藏工具提示。如果文本与当前显示的工具提示不会移动。你可以强迫首先用空白文本隐藏提示,然后显示新尖端在新位置

因此,您可以提供将在其中显示QToolTip的矩形。然后,如果你想做的是只在用户点击时关闭工具提示,你可以捕获mouseButtonPress事件,正如@HostileFork指出的那样,然后只在事件的坐标落在它的范围内时关闭工具提示。

最新更新