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 e0b5ff4ad5. 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 <volker.hilsheimer@qt.io>
bb10
parent
c7b457e287
commit
036c3c19e7
|
|
@ -249,10 +249,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:
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in New Issue