summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan-Arve Sæther <jan-arve.saether@nokia.com>2009-04-17 16:59:17 (GMT)
committerJan-Arve Sæther <jan-arve.saether@nokia.com>2009-04-17 16:59:17 (GMT)
commit2c762f3b8b284a7c6dc0c499b7052013bad5b707 (patch)
tree82389f7115010af87389f0c19a5cf2c40f83efd8
parent50e29dc095eaab396848f6640a59bba77ae28943 (diff)
downloadQt-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.cpp5
-rw-r--r--tests/auto/qwidget/tst_qwidget.cpp29
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()