kdelibs/Use-deleteLater-in-Part-slo...

52 lines
1.8 KiB
Diff

commit 4f7ea2f770cf062ef22293fbb21a086f3e0cbfcb
Author: Allen Winter <winter@kde.org>
Date: Tue Oct 20 16:36:32 2015 -0400
backport commit b72fc5e56579035bf987075e16324ef95ef8e3d4
Author: Alex Merry <alex.merry@kde.org>
Date: Mon Oct 19 20:54:13 2015 +0100
Use deleteLater in Part::slotWidgetDestroyed().
When a part's main widget is destroyed, we should not delete the part
immediately - both because deleting an object from inside one of its
signals is not safe generally, and because derived classes may well hold
QPointers to the widgets, expecting them to be cleared between the
widget being destroyed and the part being destroyed.
MERGE: none
diff --git a/kparts/part.cpp b/kparts/part.cpp
index 20089d4..2cfee81 100644
--- a/kparts/part.cpp
+++ b/kparts/part.cpp
@@ -350,7 +350,7 @@ void Part::slotWidgetDestroyed()
d->m_widget = 0;
if (d->m_autoDeletePart) {
kDebug(1000) << "deleting part" << objectName();
- delete this; // ouch, this should probably be deleteLater()
+ this->deleteLater();
}
}
diff --git a/kparts/tests/parttest.cpp b/kparts/tests/parttest.cpp
index e48b578..232aa07 100644
--- a/kparts/tests/parttest.cpp
+++ b/kparts/tests/parttest.cpp
@@ -48,6 +48,7 @@ void PartTest::testAutoDeletePart()
KParts::Part* part = new TestPart(0, 0);
QPointer<KParts::Part> partPointer(part);
delete part->widget();
+ QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
QVERIFY(partPointer.isNull());
}
@@ -57,6 +58,7 @@ void PartTest::testAutoDeleteWidget()
QPointer<KParts::Part> partPointer(part);
QPointer<QWidget> widgetPointer(part->widget());
delete part;
+ QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
QVERIFY(widgetPointer.isNull());
}