summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2021-09-02 13:21:46 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2021-09-02 20:34:48 +0200
commit7ba75d088c3eba81a1d2bb708119442991d9f30b (patch)
treeef80a127f9d8d9d6c3ee40a4dacae2f9b2ddf0fb /tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
parentf10ec04a6c9249ec7fad1d661bbb85610dd6d6f1 (diff)
QWidget: close the QWindow in QWidget::close
We want to close the window, end full screen mode on macOS, and free platform resources. This is all done by QWindow::close. QWindow::close closes the platform window, triggering a closeEvent to QWidgetWindow, which then calls QWidgetPrivate::close_helper. This way, closing a window via QWidget::close, QWindow::close, or interactively by the user are all equivalent. The QCloseEvent generated by the widget needs to be spontaneous for window-system generated events (i.e. the user clicked the close button), and non-spontaneous if the window closes because of a call to QWindow::close. To keep track of whether the event originated in an explicit call to QWindow::close, add a boolean to the QWindowPrivate. Add a test case that verifies that the window resources is destroyed, and that events are delivered as they should. Done-with: Morten Johan Sørvig <morten.sorvig@qt.io> Fixes: QTBUG-46701 Pick-to: 6.2 Change-Id: Iacb6a2c8d5e880b16b0c8f0c9257ed94bed36f5b Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp')
-rw-r--r--tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
index dbd541c736..6d6affa23a 100644
--- a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
+++ b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
@@ -90,6 +90,8 @@ private slots:
void tst_show_resize();
void tst_show_resize_hide_show();
+ void close();
+
void tst_windowFilePathAndwindowTitle_data();
void tst_windowFilePathAndwindowTitle();
void tst_windowFilePath_data();
@@ -247,6 +249,70 @@ void tst_QWidget_window::tst_show_resize_hide_show()
QCOMPARE(w.size(), m_testWidgetSize);
}
+void tst_QWidget_window::close()
+{
+ // Verfy that closing a QWidgetWindow deletes its platform window,
+ // as expected of a QWindow subclass. This must be done also
+ // if QWidget API is used to close. The QCloseEvent must not be
+ // spontaneous if the close is triggered by a Qt API that the application
+ // would call in response to an event, and spontaneous if it is directly
+ // caused by user interaction, such as clicking the (x) in the titlebar.
+ // We can simulate this only by generating a WindowSystemEvent.
+ // Children of the window should get a hide event (never spontaneous when
+ // caused by closing the window).
+
+ struct Widget : public QWidget
+ {
+ using QWidget::QWidget;
+ int spontClose = -1;
+ int spontHide = -1;
+ protected:
+ void hideEvent(QHideEvent *e)
+ { spontHide = e->spontaneous() ? 1 : 0; }
+ void closeEvent(QCloseEvent *e)
+ { spontClose = e->spontaneous() ? 1 : 0; }
+ };
+
+ // QWindow::close()
+ {
+ Widget w;
+ Widget child(&w);
+ w.winId();
+ QVERIFY(w.windowHandle());
+ QVERIFY(w.windowHandle()->handle());
+ w.windowHandle()->close();
+ QCOMPARE(w.spontClose, 0);
+ QCOMPARE(child.spontHide, -1); // was never shown
+ QVERIFY(w.windowHandle());
+ QVERIFY(!w.windowHandle()->handle());
+ }
+
+ // QWidget::close()
+ {
+ Widget w;
+ Widget child(&w);
+ w.show();
+ QVERIFY(w.windowHandle());
+ QVERIFY(w.windowHandle()->handle());
+ w.close();
+ QCOMPARE(w.spontClose, 0);
+ QCOMPARE(child.spontHide, 0);
+ QVERIFY(w.windowHandle());
+ QVERIFY(!w.windowHandle()->handle());
+ }
+
+ // User-initiated close
+ {
+ Widget w;
+ Widget child(&w);
+ w.show();
+ QWindowSystemInterface::handleCloseEvent(w.windowHandle());
+ QApplication::processEvents();
+ QCOMPARE(w.spontClose, 1);
+ QCOMPARE(child.spontHide, 0);
+ }
+}
+
class PaintTestWidget : public QWidget
{
public: