diff options
author | Alexander Volkov <a.volkov@rusbitech.ru> | 2016-02-22 12:47:19 +0300 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@theqtcompany.com> | 2016-03-24 16:37:01 +0000 |
commit | 6cacd19db56b632964c3b2453bc273dac50446c9 (patch) | |
tree | e122f58e5835d7b3eb8171d91b001c4c52545ecd /src/widgets/kernel/qwidgetwindow.cpp | |
parent | aedda12ef1a2a9945d32afbc7e46f21773aed223 (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>
Diffstat (limited to 'src/widgets/kernel/qwidgetwindow.cpp')
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 24 |
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); |