Add test-case for QWidget closing exits event loop

Also when closed by destruction, which as of today doesn't call
QWidget::close and therefore also not QWindow::close.

Pick-to: 6.2
Change-Id: I426255e2274eae9262243c769df2264fbaa915b0
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Volker Hilsheimer 2021-09-06 14:32:39 +02:00
parent eb39b5fd36
commit 7c85ad307b

View File

@ -52,6 +52,7 @@
#include <qmainwindow.h>
#include <qdockwidget.h>
#include <qrandom.h>
#include <qsignalspy.h>
#include <qstylehints.h>
#include <qtoolbar.h>
#include <qtoolbutton.h>
@ -426,6 +427,7 @@ private slots:
void receivesApplicationFontChangeEvent();
void receivesApplicationPaletteChangeEvent();
void deleteWindowInCloseEvent();
void quitOnClose();
private:
bool ensureScreenSize(int width, int height);
@ -12013,5 +12015,34 @@ void tst_QWidget::deleteWindowInCloseEvent()
QVERIFY(true);
}
/*!
Verify that both closing and deleting the last (only) window-widget
exits the application event loop.
*/
void tst_QWidget::quitOnClose()
{
QSignalSpy quitSpy(qApp, &QApplication::lastWindowClosed);
std::unique_ptr<QWidget>widget(new QWidget);
widget->show();
QVERIFY(QTest::qWaitForWindowExposed(widget.get()));
// QGuiApplication::lastWindowClosed is documented to only be emitted
// when we are in exec()
QTimer::singleShot(0, widget.get(), [&]{
widget->close();
});
QApplication::exec();
QCOMPARE(quitSpy.count(), 1);
widget->show();
QVERIFY(QTest::qWaitForWindowExposed(widget.get()));
QTimer::singleShot(0, widget.get(), [&]{
widget.reset();
});
QApplication::exec();
QCOMPARE(quitSpy.count(), 2);
}
QTEST_MAIN(tst_QWidget)
#include "tst_qwidget.moc"