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

时间:2011-12-15 13:09:15

标签: qt event-handling tooltip

我有一个Qt应用程序,如果发生某种内部情况,某些QLabel会显示工具提示。

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

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

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

修改

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

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

  1. 删除工具提示超时:显示工具提示时,只要用户未单击它,它就会保持可见状态。如何在Qt中显示没有超时的工具提示?
  2. 通过反复显示工具提示可见;检测单击工具提示的鼠标,以便停止保持活动循环。当用户点击工具提示时,如何收到信号?

2 个答案:

答案 0 :(得分:3)

在幕后,实现工具提示的实际类是一个名为QTipLabel的私有QLabel派生类:

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

在界面中没有任何内容可以从QToolTip获取该类的实例,因此拦截点击只会通过某种不明智的黑客来完成。

那说:应该“hideTipImmediately”的事件中QEvent::mouseButtonPress ...实际上,安装了一个事件过滤器,以便应用程序中的任何点击将隐藏它:< / p>

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

因此,如果您没有看到工具提示在被点击时消失,则会出现错误。 (点击工具提示会在Kubuntu下的基于Qt的应用程序中隐藏它们。)

答案 1 :(得分:1)

注意QToolTip :: showText:

的定义
  

void QToolTip :: showText(const QPoint&amp; pos,const QString&amp; text,   QWidget * w,const QRect&amp; rect)[静态]将文本显示为工具提示,   以全球排名pos作为兴趣点。工具提示   将从这一点以平台特定偏移显示   兴趣。

     

如果您指定非空的矩形,则您的提示将立即隐藏   将光标移出此区域。

     

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

     

如果文字为空,则隐藏工具提示。如果文字是相同的   当前显示的工具提示,提示不会移动。你可以强迫   首先用空文本隐藏提示,然后显示   新职位的新提示。

因此,您可以提供要在其中呈现QToolTip的矩形。然后,如果您想要做的只是在用户点击 it 时关闭QToolTip,您可以捕获mouseHuttilePress指出的mouseButtonPress事件,然后仅在事件坐标下降时关闭工具提示在其中。