summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp8
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp20
2 files changed, 26 insertions, 2 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index c3f570ce4f..e74243203a 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -243,10 +243,14 @@ bool QWidgetWindow::event(QEvent *event)
}
switch (event->type()) {
- case QEvent::Close:
+ case QEvent::Close: {
+ // The widget might be deleted in the close event handler.
+ QPointer<QObject> guard = this;
handleCloseEvent(static_cast<QCloseEvent *>(event));
- QWindow::event(event);
+ if (guard)
+ QWindow::event(event);
return true;
+ }
case QEvent::Enter:
case QEvent::Leave:
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index 788e005939..9d2ed2e14e 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -399,6 +399,8 @@ private slots:
void closeEvent();
void closeWithChildWindow();
+ void deleteWindowInCloseEvent();
+
private:
bool ensureScreenSize(int width, int height);
@@ -11144,5 +11146,23 @@ void tst_QWidget::closeWithChildWindow()
QVERIFY(!childWidget->isVisible());
}
+class DeleteOnCloseEventWidget : public QWidget
+{
+protected:
+ virtual void closeEvent(QCloseEvent *e) override
+ {
+ e->accept();
+ delete this;
+ }
+};
+
+void tst_QWidget::deleteWindowInCloseEvent()
+{
+ // Just checking if closing this widget causes a crash
+ auto widget = new DeleteOnCloseEventWidget;
+ widget->close();
+ QVERIFY(true);
+}
+
QTEST_MAIN(tst_QWidget)
#include "tst_qwidget.moc"