From 036c3c19e7da5f1a280750d3c68a0cff38678029 Mon Sep 17 00:00:00 2001 From: Miika Pernu Date: Thu, 14 May 2020 15:26:51 +0300 Subject: Fix to crash in QWindow::event when delete this called on closeEvent Starting from Qt 5.11 QWindow::event is called after QDialog::closeEvent which would cause a crash if "delete this" was called on closeEvent. The commit that changed this was e0b5ff4ad583befbecbcbe462998e3ed80899531. Added a check before QWindow::event call utilizing QPointer to prevent the function call in case object is destroyed by a user in close event handler. Change-Id: I64a4a0f3271714e55bf7e806177f0d8b39b67fa3 Fixes: QTBUG-84222 Pick-to: 5.15 5.12 Reviewed-by: Volker Hilsheimer --- tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'tests') diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 991211062f..365f64014a 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -419,6 +419,7 @@ private slots: void receivesLanguageChangeEvent(); void receivesApplicationFontChangeEvent(); void receivesApplicationPaletteChangeEvent(); + void deleteWindowInCloseEvent(); private: bool ensureScreenSize(int width, int height); @@ -11774,5 +11775,23 @@ void tst_QWidget::receivesApplicationPaletteChangeEvent() QApplication::setPalette(origPalette); } +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" -- cgit v1.2.3