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>
This commit is contained in:
Alexander Volkov 2016-02-22 12:47:19 +03:00 committed by Shawn Rutledge
parent aedda12ef1
commit 6cacd19db5

View File

@ -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);