diff options
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 16 | ||||
-rw-r--r-- | tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 24 |
2 files changed, 39 insertions, 1 deletions
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 66511b8d5b..423bb33cc2 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<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)) diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 0de006a041..34bb4cfdf6 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. |