emit lastWindowClosed even if quitOnLastWindowClosed is false

Behavior will agree with the docs.

[ChangeLog][QtGui][QWindow] lastWindowClosed will be emitted even if
quitOnLastWindowClosed is not set

Task-number: QTBUG-32956
Change-Id: I7bb269d53894859fee27e171eea7ad472ea86af0
Reviewed-by: Jørgen Lind <jorgen.lind@theqtcompany.com>
This commit is contained in:
Shawn Rutledge 2013-08-20 09:12:40 +02:00
parent 7aadf03fea
commit 32422885fc
2 changed files with 39 additions and 14 deletions

View File

@ -2290,24 +2290,22 @@ void QWindowPrivate::maybeQuitOnLastWindowClosed()
Q_Q(QWindow);
// Attempt to close the application only if this has WA_QuitOnClose set and a non-visible parent
bool quitOnClose = QGuiApplication::quitOnLastWindowClosed() && !q->parent();
if (quitOnClose) {
QWindowList list = QGuiApplication::topLevelWindows();
bool lastWindowClosed = true;
for (int i = 0; i < list.size(); ++i) {
QWindow *w = list.at(i);
if (!w->isVisible() || w->transientParent())
continue;
lastWindowClosed = false;
break;
}
if (lastWindowClosed) {
QGuiApplicationPrivate::emitLastWindowClosed();
QWindowList list = QGuiApplication::topLevelWindows();
bool lastWindowClosed = true;
for (int i = 0; i < list.size(); ++i) {
QWindow *w = list.at(i);
if (!w->isVisible() || w->transientParent())
continue;
lastWindowClosed = false;
break;
}
if (lastWindowClosed) {
QGuiApplicationPrivate::emitLastWindowClosed();
if (quitOnClose) {
QCoreApplicationPrivate *applicationPrivate = static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(QCoreApplication::instance()));
applicationPrivate->maybeQuit();
}
}
}
QWindow *QWindowPrivate::topLevelWindow() const

View File

@ -812,6 +812,33 @@ void tst_QGuiApplication::quitOnLastWindowClosed()
QCOMPARE(spy.count(), 1);
QVERIFY(spy2.count() > 15); // Should be around 20 if closing did not cause the quit
}
{
int argc = 0;
QGuiApplication app(argc, 0);
app.setQuitOnLastWindowClosed(false);
QTimer timer;
timer.setInterval(2000);
timer.setSingleShot(true);
QObject::connect(&timer, SIGNAL(timeout()), &app, SLOT(quit()));
QSignalSpy spy(&app, SIGNAL(lastWindowClosed()));
QSignalSpy spy2(&timer, SIGNAL(timeout()));
QPointer<QWindow> mainWindow = new QWindow;
mainWindow->show();
QTimer::singleShot(1000, mainWindow, SLOT(close())); // This should not quit the application
timer.start();
app.exec();
QCOMPARE(spy2.count(), 1); // quit timer fired
QCOMPARE(spy.count(), 1); // lastWindowClosed emitted
app.setQuitOnLastWindowClosed(true); // restore underlying static to default value
}
}
static Qt::ScreenOrientation testOrientationToSend = Qt::PrimaryOrientation;