diff options
author | Jan-Arve Sæther <jan-arve.saether@nokia.com> | 2009-04-17 16:59:17 (GMT) |
---|---|---|
committer | Jan-Arve Sæther <jan-arve.saether@nokia.com> | 2009-04-17 16:59:17 (GMT) |
commit | 2c762f3b8b284a7c6dc0c499b7052013bad5b707 (patch) | |
tree | 82389f7115010af87389f0c19a5cf2c40f83efd8 | |
parent | 50e29dc095eaab396848f6640a59bba77ae28943 (diff) | |
download | Qt-2c762f3b8b284a7c6dc0c499b7052013bad5b707.zip Qt-2c762f3b8b284a7c6dc0c499b7052013bad5b707.tar.gz Qt-2c762f3b8b284a7c6dc0c499b7052013bad5b707.tar.bz2 |
Make sure tooltips are shown properly in popups.
The problem was that if you had child widgets of a popup, only child
widgets that had hasMouseTracking() == true received the ToolTip
event. This was because in order for a widget to receive a ToolTip,
it relied on the MouseMove event.
It still relies on the MouseMove event, but the problem with the
previous code was that it did not even *try* to deliver the MouseMove
event to the widget that did not have mousetracking. And it was
the code that "tried" to deliver (QApplication::notify()) the event
that also was responsible of finding which widget it should get the
tooltip from. Unfortunately the previous code did not even enter
QApplication::notify() because of that early cut-off.
The result was that the event was propagated up to the parent widget
(which was the popup) and consumed by the popup. (Nothing would happen
unless the popup itself had a tooltip). This is also how
translateMouseEvent() is implemented in qapplication_x11.cpp.
-rw-r--r-- | src/gui/kernel/qapplication_win.cpp | 5 | ||||
-rw-r--r-- | tests/auto/qwidget/tst_qwidget.cpp | 29 |
2 files changed, 30 insertions, 4 deletions
diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index fae0335..2f2fc2c 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -3164,10 +3164,7 @@ bool QETWidget::translateMouseEvent(const MSG &msg) if (popupButtonFocus) { target = popupButtonFocus; } else if (popupChild) { - // forward mouse events to the popup child. mouse move events - // are only forwarded to popup children that enable mouse tracking. - if (type != QEvent::MouseMove || popupChild->hasMouseTracking()) - target = popupChild; + target = popupChild; } pos = target->mapFromGlobal(globalPos); diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index a557563..9547c8f 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -5787,6 +5787,35 @@ void tst_QWidget::setToolTip() widget.setToolTip(QString()); QCOMPARE(widget.toolTip(), QString()); QCOMPARE(spy.count(), 2); + + + + for (int pass = 0; pass < 2; ++pass) { + QWidget *popup = new QWidget(0, Qt::Popup); + popup->resize(150, 50); + QFrame *frame = new QFrame(popup); + frame->setGeometry(0, 0, 50, 50); + frame->setFrameStyle(QFrame::Box | QFrame::Plain); + EventSpy spy1(frame, QEvent::ToolTip); + EventSpy spy2(popup, QEvent::ToolTip); + frame->setMouseTracking(pass == 0 ? false : true); + frame->setToolTip(QLatin1String("TOOLTIP FRAME")); + popup->setToolTip(QLatin1String("TOOLTIP POPUP")); + popup->show(); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(popup); +#endif + QTest::qWait(100); + QTest::mouseMove(frame); + QTest::qWait(900); // delay is 700 + + QCOMPARE(spy1.count(), 1); + QCOMPARE(spy2.count(), 0); + if (pass == 0) + QTest::qWait(2200); // delay is 2000 + QTest::mouseMove(popup); + delete popup; + } } void tst_QWidget::testWindowIconChangeEventPropagation() |