From d99e0764e2fe9bc7e652474b5d70e8b66154b807 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Wed, 7 Sep 2016 15:49:37 +0200 Subject: Delete replaced delegates after Component.completed() is emitted This avoids the issue "Object destroyed during incubation" error. A proper fix is still required in the QML engine. Change-Id: I3c168cfe2d8c295662bcb5886e99a0f95748e302 Task-number: QTBUG-50992 Reviewed-by: J-P Nurmi --- src/quicktemplates2/qquicktextfield.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/quicktemplates2/qquicktextfield.cpp') diff --git a/src/quicktemplates2/qquicktextfield.cpp b/src/quicktemplates2/qquicktextfield.cpp index 3b09b27b..f893bdb5 100644 --- a/src/quicktemplates2/qquicktextfield.cpp +++ b/src/quicktemplates2/qquicktextfield.cpp @@ -239,6 +239,18 @@ QAccessible::Role QQuickTextFieldPrivate::accessibleRole() const } #endif +/* + Deletes "delegate" if Component.completed() has been emitted, + otherwise stores it in pendingDeletions. +*/ +void QQuickTextFieldPrivate::deleteDelegate(QObject *delegate) +{ + if (componentComplete) + delete delegate; + else + pendingDeletions.append(delegate); +} + QFont QQuickTextField::font() const { return QQuickTextInput::font(); @@ -277,7 +289,7 @@ void QQuickTextField::setBackground(QQuickItem *background) if (d->background == background) return; - delete d->background; + d->deleteDelegate(d->background); d->background = background; if (background) { background->setParentItem(this); @@ -365,6 +377,9 @@ void QQuickTextField::componentComplete() if (!d->accessibleAttached && QAccessible::isActive()) d->accessibilityActiveChanged(true); #endif + + qDeleteAll(d->pendingDeletions); + d->pendingDeletions.clear(); } void QQuickTextField::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) -- cgit v1.2.3