Generate Show/Hide events for widgets when minimized state changes.

Fixes a regression against Qt 4, where Show/Hide events were received
when the minimized state changed.

It is restricted to QWidget so as not to introduce additional events
to QWindow (which already has signal visibilityChanged()) and cause
unexpected side effects in QQuickWindow.

Task-number: QTBUG-41312
Change-Id: Ib165a5daf7a7e5d8231ef8a94b70e8a2a3253057
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
This commit is contained in:
Friedemann Kleint 2014-09-24 12:14:03 +02:00
parent d41d4a0a35
commit 4b03b18548
2 changed files with 39 additions and 1 deletions

View File

@ -8893,7 +8893,6 @@ bool QWidget::event(QEvent *event)
case QEvent::ModifiedChange:
case QEvent::MouseTrackingChange:
case QEvent::ParentChange:
case QEvent::WindowStateChange:
case QEvent::LocaleChange:
case QEvent::MacSizeChange:
case QEvent::ContentsRectChange:
@ -8902,6 +8901,21 @@ bool QWidget::event(QEvent *event)
changeEvent(event);
break;
case QEvent::WindowStateChange: {
const bool wasMinimized = static_cast<const QWindowStateChangeEvent *>(event)->oldState() & Qt::WindowMinimized;
if (wasMinimized != isMinimized()) {
if (wasMinimized) {
QShowEvent showEvent;
QCoreApplication::sendEvent(const_cast<QWidget *>(this), &showEvent);
} else {
QHideEvent hideEvent;
QCoreApplication::sendEvent(const_cast<QWidget *>(this), &hideEvent);
}
}
changeEvent(event);
}
break;
case QEvent::WindowActivate:
case QEvent::WindowDeactivate: {
if (isVisible() && !palette().isEqual(QPalette::Active, QPalette::Inactive))

View File

@ -272,6 +272,7 @@ private slots:
void showHideEvent_data();
void showHideEvent();
void showHideEventWhileMinimize();
void lostUpdatesOnHide();
@ -4087,6 +4088,29 @@ void tst_QWidget::showHideEvent()
QCOMPARE(widget.numberOfHideEvents, expectedHideEvents);
}
void tst_QWidget::showHideEventWhileMinimize()
{
const QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
if (!pi->hasCapability(QPlatformIntegration::MultipleWindows)
|| !pi->hasCapability(QPlatformIntegration::NonFullScreenWindows)
|| !pi->hasCapability(QPlatformIntegration::WindowManagement)) {
QSKIP("This test requires window management capabilities");
}
// QTBUG-41312, hide, show events should be received during minimized.
ShowHideEventWidget widget;
widget.setWindowTitle(__FUNCTION__);
widget.resize(m_testWidgetSize);
centerOnScreen(&widget);
widget.show();
QVERIFY(QTest::qWaitForWindowExposed(&widget));
const int showEventsBeforeMinimize = widget.numberOfShowEvents;
const int hideEventsBeforeMinimize = widget.numberOfHideEvents;
widget.showMinimized();
QTRY_COMPARE(widget.numberOfHideEvents, hideEventsBeforeMinimize + 1);
widget.showNormal();
QTRY_COMPARE(widget.numberOfShowEvents, showEventsBeforeMinimize + 1);
}
void tst_QWidget::update()
{
QTest::qWait(10); // Wait for the initStuff to do it's stuff.