summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qwindow.cpp3
-rw-r--r--src/widgets/kernel/qwidget.cpp3
-rw-r--r--tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp40
-rw-r--r--tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp40
4 files changed, 83 insertions, 3 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 43b7e39103..61ae2a2438 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -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);
}
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index e3a8908c37..f5a1ea15cd 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -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);
diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
index 2fd875b7f4..8d0836e7c3 100644
--- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
+++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
@@ -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"
diff --git a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
index 7017c6157e..c600956912 100644
--- a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
+++ b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
@@ -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)