Move the removal of the Quit event to QWindow.
authorStephen Kelly <stephen.kelly@kdab.com>
Sat, 11 Feb 2012 00:10:07 +0000 (01:10 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 15 Feb 2012 19:47:32 +0000 (20:47 +0100)
Change-Id: If524127ba9dab9ef065aaf4079294295eef8e49b
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
src/gui/kernel/qwindow.cpp
src/widgets/kernel/qwidget.cpp
tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp

index 43b7e39..61ae2a2 100644 (file)
@@ -178,6 +178,9 @@ void QWindow::setVisible(bool visible)
         create();
 
     if (visible) {
+        // remove posted quit events when showing a new window
+        QCoreApplication::removePostedEvents(qApp, QEvent::Quit);
+
         QShowEvent showEvent;
         QGuiApplication::sendEvent(this, &showEvent);
     }
index e3a8908..f5a1ea1 100644 (file)
@@ -7245,9 +7245,6 @@ void QWidget::setVisible(bool visible)
         setAttribute(Qt::WA_KeyboardFocusChange, false);
 
         if (isWindow() || parentWidget()->isVisible()) {
-            // remove posted quit events when showing a new window
-            QCoreApplication::removePostedEvents(qApp, QEvent::Quit);
-
             d->show_helper();
 
             qApp->d_func()->sendSyntheticEnterLeave(this);
index 2fd875b..8d0836e 100644 (file)
@@ -53,6 +53,7 @@ private slots:
     void focusObject();
     void allWindows();
     void topLevelWindows();
+    void abortQuitOnShow();
 };
 
 class DummyWindow : public QWindow
@@ -152,5 +153,44 @@ void tst_QGuiApplication::topLevelWindows()
     QCOMPARE(app.topLevelWindows().count(), 0);
 }
 
+class ShowCloseShowWindow : public QWindow
+{
+    Q_OBJECT
+public:
+    ShowCloseShowWindow(bool showAgain, QWindow *parent = 0)
+      : QWindow(parent), showAgain(showAgain)
+    {
+        QTimer::singleShot(0, this, SLOT(doClose()));
+        QTimer::singleShot(500, this, SLOT(exitApp()));
+    }
+
+private slots:
+    void doClose() {
+        close();
+        if (showAgain)
+            show();
+    }
+
+    void exitApp() {
+      qApp->exit(1);
+    }
+
+private:
+    bool showAgain;
+};
+
+void tst_QGuiApplication::abortQuitOnShow()
+{
+    int argc = 0;
+    QGuiApplication app(argc, 0);
+    QWindow *window1 = new ShowCloseShowWindow(false);
+    window1->show();
+    QCOMPARE(app.exec(), 0);
+
+    QWindow *window2 = new ShowCloseShowWindow(true);
+    window2->show();
+    QCOMPARE(app.exec(), 1);
+}
+
 QTEST_APPLESS_MAIN(tst_QGuiApplication)
 #include "tst_qguiapplication.moc"
index 7017c61..c600956 100644 (file)
@@ -149,6 +149,8 @@ private slots:
     void testQuitLock8();
 
     void globalStaticObjectDestruction(); // run this last
+
+    void abortQuitOnShow();
 };
 
 class EventSpy : public QObject
@@ -2560,6 +2562,44 @@ void tst_QApplication::testQuitLock8()
     // No hang = pass
 }
 
+class ShowCloseShowWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    ShowCloseShowWidget(bool showAgain, QWidget *parent = 0)
+      : QWidget(parent), showAgain(showAgain)
+    {
+        QTimer::singleShot(0, this, SLOT(doClose()));
+        QTimer::singleShot(500, this, SLOT(exitApp()));
+    }
+
+private slots:
+    void doClose() {
+        close();
+        if (showAgain)
+            show();
+    }
+
+    void exitApp() {
+      qApp->exit(1);
+    }
+
+private:
+    bool showAgain;
+};
+
+void tst_QApplication::abortQuitOnShow()
+{
+    int argc = 0;
+    QApplication app(argc, 0);
+    QWidget *window1 = new ShowCloseShowWidget(false);
+    window1->show();
+    QCOMPARE(app.exec(), 0);
+
+    QWidget *window2 = new ShowCloseShowWidget(true);
+    window2->show();
+    QCOMPARE(app.exec(), 1);
+}
 
 /*
     This test is meant to ensure that certain objects (public & commonly used)