Как обнаружить щелчок мыши внутри всплывающей подсказки в Qt? - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть приложение Qt, в котором определенный QLabel отображает всплывающую подсказку, если возникает определенное внутреннее состояние.

Поскольку всплывающая подсказка имеет тайм-аут и автоматически скрывается Qt, всплывающая подсказка поддерживается приложением, показывая подсказку каждые 3 секунды (я не нашел никакого механизма, позволяющего Qt показывать подсказку бесконечно).

Подсказка отображается до тех пор, пока пользователь не щелкнет сам QLabel: подсказка больше не обновляется и исчезает.

Теперь у меня есть новое требование, чтобы подсказка также исчезала, если пользователь нажимает на саму подсказку. Есть ли сигнал, который посылается, когда пользователь нажимает на видимую подсказку? Или нужно использовать более сложную технику?

EDIT

Я снова проверил свой код, вот дополнительная информация.

Qt обнаруживает щелчок мыши на всплывающей подсказке и скрывает ее, но приложение немедленно снова показывает подсказку. Я хотел бы, чтобы Qt информировал мой код о событии, вызванном щелчком мыши, чтобы он снова и снова не отображал всплывающую подсказку. Я имею в виду два возможных решения, но я не знаю, является ли одно из них технически осуществимым:

  1. Удалить время ожидания всплывающей подсказки: когда подсказка отображается, она остается видимой до тех пор, пока пользователь не щелкнет по ней. Как я могу отобразить всплывающую подсказку без таймаута в Qt?
  2. Держите подсказку видимой, многократно показывая ее; обнаружить щелчок мыши на всплывающей подсказке, чтобы остановить цикл проверки активности. Как получить сигнал, когда пользователь нажимает на всплывающую подсказку?

Ответы [ 2 ]

4 голосов
/ 15 декабря 2011

Под капотом фактическим классом, реализующим всплывающую подсказку, является частный класс, производный от QLabel, с именем QTipLabel:

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.)

1 голос
/ 15 декабря 2011

Обратите внимание на определение QToolTip :: showText:

void QToolTip :: showText (const QPoint & pos, const QString & text, QWidget * w, const QRect & rect) [статические] Показывает текст в виде всплывающей подсказки, с глобальной позицией pos как точка интереса. Подсказка будет показано с конкретной платформой смещения от этой точки интерес.

Если вы укажете непустой прямоугольник, подсказка будет скрыта, как только вы переместите курсор из этой области.

Прямоугольник находится в координатах виджета, который вы указываете с помощью w. Если Прямоугольник не пуст, вы должны указать виджет. В противном случае это аргумент может быть 0, но он используется для определения соответствующего экрана в многоголовочных системах.

Если текст пуст, подсказка скрыта. Если текст такой же, как показанная подсказка, подсказка не будет двигаться. Вы можете заставить двигаясь, сначала скрывая подсказку с пустым текстом, а затем показывая новый совет на новой позиции.

Таким образом, вы можете указать прямоугольник, в котором должна быть представлена ​​подсказка QToolTip. Затем, если вы хотите закрыть QToolTip только тогда, когда пользователь нажимает it , вы можете захватывать события mouseButtonPress, как указано @HostileFork, а затем закрывать всплывающую подсказку только тогда, когда координаты события находятся в пределах это.

...