From 4b03b18548200db0ad65415c7df7a7665a9ec3d8 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 24 Sep 2014 12:14:03 +0200 Subject: [PATCH] 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 --- src/widgets/kernel/qwidget.cpp | 16 ++++++++++++- .../widgets/kernel/qwidget/tst_qwidget.cpp | 24 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 66511b8d5bc..423bb33cc2c 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -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(event)->oldState() & Qt::WindowMinimized; + if (wasMinimized != isMinimized()) { + if (wasMinimized) { + QShowEvent showEvent; + QCoreApplication::sendEvent(const_cast(this), &showEvent); + } else { + QHideEvent hideEvent; + QCoreApplication::sendEvent(const_cast(this), &hideEvent); + } + } + changeEvent(event); + } + break; + case QEvent::WindowActivate: case QEvent::WindowDeactivate: { if (isVisible() && !palette().isEqual(QPalette::Active, QPalette::Inactive)) diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 0de006a0411..34bb4cfdf64 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -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.