【问题标题】:How to detect a mouse click inside a tooltip in Qt?如何检测Qt工具提示内的鼠标点击?
【发布时间】:2011-12-20 19:45:32
【问题描述】:

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

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

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

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

编辑

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

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

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

【问题讨论】:

    标签: qt event-handling tooltip


    【解决方案1】:

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

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

    界面中没有发布任何内容以从 QToolTip 获取该类的实例,因此只能通过某种不明智的 hack 来拦截点击。

    也就是说:在应该“立即隐藏提示”的事件中,QEvent::mouseButtonPress...事实上,安装了一个事件过滤器,以便在应用中任何点击都会隐藏它:

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

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

    【讨论】:

    • 非常感谢!我将检查是否在应用程序的某处过滤了鼠标点击,以防止工具提示消失。
    【解决方案2】:

    注意QToolTip::showText的定义:

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

    如果您指定非空矩形,则提示将在您设置后立即隐藏 将光标移出该区域。

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

    如果文本为空,则隐藏工具提示。如果文本与 当前显示的工具提示,提示不会移动。你可以强制 通过首先隐藏带有空文本的提示,然后显示 新位置的新提示。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      相关资源
      最近更新 更多