diff options
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 2 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 2 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp | 63 | ||||
-rw-r--r-- | tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp | 24 |
5 files changed, 90 insertions, 3 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 3e999bee8d..846b7d01bf 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -2129,7 +2129,7 @@ bool QGuiApplicationPrivate::shouldQuit() QWindowList list = QGuiApplication::topLevelWindows(); for (int i = 0; i < list.size(); ++i) { QWindow *w = list.at(i); - if (w->isVisible()) + if (w->isVisible() && !w->transientParent()) return false; } return true; diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 8fe62bb7fd..f30a794b55 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -1708,7 +1708,7 @@ void QWindowPrivate::maybeQuitOnLastWindowClosed() bool lastWindowClosed = true; for (int i = 0; i < list.size(); ++i) { QWindow *w = list.at(i); - if (!w->isVisible()) + if (!w->isVisible() || w->transientParent()) continue; lastWindowClosed = false; break; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index e9003e8c14..0553dabe51 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2950,7 +2950,7 @@ bool QApplicationPrivate::shouldQuit() if (w->isVisible() && !w->parentWidget() && w->testAttribute(Qt::WA_QuitOnClose)) return false; } - return true; + return QGuiApplicationPrivate::shouldQuit(); } /*! \reimp diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp index 578ea9f693..372dd65ff4 100644 --- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp +++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp @@ -57,6 +57,7 @@ private slots: void changeFocusWindow(); void keyboardModifiers(); void modalWindow(); + void quitOnLastWindowClosed(); }; class DummyWindow : public QWindow @@ -491,5 +492,67 @@ void tst_QGuiApplication::modalWindow() delete window1; } +void tst_QGuiApplication::quitOnLastWindowClosed() +{ + { + int argc = 0; + QGuiApplication app(argc, 0); + + QTimer timer; + timer.setInterval(100); + + QSignalSpy spy(&app, SIGNAL(aboutToQuit())); + QSignalSpy spy2(&timer, SIGNAL(timeout())); + + QPointer<QWindow> mainWindow = new QWindow; + QPointer<QWindow> dialog = new QWindow; + + dialog->setTransientParent(mainWindow); + + QVERIFY(app.quitOnLastWindowClosed()); + + mainWindow->show(); + dialog->show(); + + timer.start(); + QTimer::singleShot(1000, mainWindow, SLOT(close())); // This should quit the application + QTimer::singleShot(2000, &app, SLOT(quit())); // This makes sure we quit even if it didn't + + app.exec(); + + QCOMPARE(spy.count(), 1); + QVERIFY(spy2.count() < 15); // Should be around 10 if closing caused the quit + } + { + int argc = 0; + QGuiApplication app(argc, 0); + + QTimer timer; + timer.setInterval(100); + + QSignalSpy spy(&app, SIGNAL(aboutToQuit())); + QSignalSpy spy2(&timer, SIGNAL(timeout())); + + QPointer<QWindow> mainWindow = new QWindow; + QPointer<QWindow> dialog = new QWindow; + + QVERIFY(!dialog->transientParent()); + QVERIFY(app.quitOnLastWindowClosed()); + + mainWindow->show(); + dialog->show(); + + timer.start(); + QTimer::singleShot(1000, mainWindow, SLOT(close())); // This should not quit the application + QTimer::singleShot(2000, &app, SLOT(quit())); + + app.exec(); + + QCOMPARE(spy.count(), 1); + QVERIFY(spy2.count() > 15); // Should be around 20 if closing did not cause the quit + } +} + + QTEST_APPLESS_MAIN(tst_QGuiApplication) #include "tst_qguiapplication.moc" diff --git a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp index 000eea8555..120ed9127c 100644 --- a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp +++ b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp @@ -718,6 +718,30 @@ void tst_QApplication::quitOnLastWindowClosed() QCOMPARE(timerSpy.count(), 1); QCOMPARE(appSpy.count(), 2); } + { + int argc = 0; + QApplication app(argc, 0, QApplication::GuiServer); + QVERIFY(app.quitOnLastWindowClosed()); + + QTimer timer; + timer.setInterval(100); + QSignalSpy timerSpy(&timer, SIGNAL(timeout())); + + QWindow w; + w.show(); + + QWidget wid; + wid.show(); + + timer.start(); + QTimer::singleShot(1000, &wid, SLOT(close())); // This should NOT quit the application because the + // QWindow is still there. + QTimer::singleShot(2000, &app, SLOT(quit())); // This causes the quit. + + app.exec(); + + QVERIFY(timerSpy.count() > 15); // Should be around 20 if closing did not caused the quit + } } class PromptOnCloseWidget : public QWidget |