summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Volkov <a.volkov@rusbitech.ru>2016-02-22 12:47:19 +0300
committerShawn Rutledge <shawn.rutledge@theqtcompany.com>2016-03-24 16:37:01 +0000
commit6cacd19db56b632964c3b2453bc273dac50446c9 (patch)
treee122f58e5835d7b3eb8171d91b001c4c52545ecd
parentaedda12ef1a2a9945d32afbc7e46f21773aed223 (diff)
Don't propagate unsolicited events from QWidgetWindow to QWidget
Show and Hide events were not propagated before this change. Add Timer, DynamicPropertyChange, ChildAdded, and ChildRemoved, because they are supposed to be delivered to one QObject. Also don't propagate these events if WA_DontShowOnScreen is set. Change-Id: I134bf3909d46141e4d3e39f41983f493a4f35478 Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index 01832a4f2b..b638c6c377 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -156,11 +156,29 @@ QObject *QWidgetWindow::focusObject() const
return widget;
}
+static inline bool shouldBePropagatedToWidget(QEvent *event)
+{
+ switch (event->type()) {
+ // Handing show events to widgets would cause them to be triggered twice
+ case QEvent::Show:
+ case QEvent::Hide:
+ case QEvent::Timer:
+ case QEvent::DynamicPropertyChange:
+ case QEvent::ChildAdded:
+ case QEvent::ChildRemoved:
+ return false;
+ default:
+ return true;
+ }
+}
+
bool QWidgetWindow::event(QEvent *event)
{
if (m_widget->testAttribute(Qt::WA_DontShowOnScreen)) {
// \a event is uninteresting for QWidgetWindow, the event was probably
// generated before WA_DontShowOnScreen was set
+ if (!shouldBePropagatedToWidget(event))
+ return true;
return QCoreApplication::sendEvent(m_widget, event);
}
@@ -285,10 +303,6 @@ bool QWidgetWindow::event(QEvent *event)
return true;
#endif
- // Handing show events to widgets (see below) here would cause them to be triggered twice
- case QEvent::Show:
- case QEvent::Hide:
- return QWindow::event(event);
case QEvent::WindowBlocked:
qt_button_down = 0;
break;
@@ -303,7 +317,7 @@ bool QWidgetWindow::event(QEvent *event)
break;
}
- if (QCoreApplication::sendEvent(m_widget, event) && event->type() != QEvent::Timer)
+ if (shouldBePropagatedToWidget(event) && QCoreApplication::sendEvent(m_widget, event))
return true;
return QWindow::event(event);