diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-02-16 01:03:22 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-02-16 01:03:22 +0100 |
commit | 7d80264fa7fc71bc68ed091ff8ba97bdd7970dc4 (patch) | |
tree | e3d6878189a6079dd61cde0b20f7f10cc4d1ffb0 /src/qml/types | |
parent | 27c0e9d709aba97bd522fd3e53a53c4ff3c4d71b (diff) | |
parent | fee0fcfef08a05ed4ba9369d2352c876b514d69c (diff) |
Merge remote-tracking branch 'origin/5.13' into dev
Change-Id: I51cb42d253a83c0e6a76946c37cf1ff7c7cac150
Diffstat (limited to 'src/qml/types')
-rw-r--r-- | src/qml/types/qqmldelegatemodel.cpp | 17 | ||||
-rw-r--r-- | src/qml/types/qqmldelegatemodel_p_p.h | 1 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp index 57bbf7465d..48cc77bc3d 100644 --- a/src/qml/types/qqmldelegatemodel.cpp +++ b/src/qml/types/qqmldelegatemodel.cpp @@ -1060,7 +1060,11 @@ QObject *QQmlDelegateModelPrivate::object(Compositor::Group group, int index, QQ = qobject_cast<QQmlAdaptorModelProxyInterface *>(cacheItem)) { ctxt = new QQmlContextData; ctxt->setParent(cacheItem->contextData, /*stronglyReferencedByParent*/true); - ctxt->contextObject = proxy->proxiedObject(); + QObject *proxied = proxy->proxiedObject(); + ctxt->contextObject = proxied; + // We don't own the proxied object. We need to clear it if it goes away. + QObject::connect(proxied, &QObject::destroyed, + cacheItem, &QQmlDelegateModelItem::childContextObjectDestroyed); } } @@ -2009,6 +2013,17 @@ QV4::ReturnedValue QQmlDelegateModelItem::get_index(QQmlDelegateModelItem *thisI return QV4::Encode((int)thisItem->groupIndex(Compositor::Group(flag))); } +void QQmlDelegateModelItem::childContextObjectDestroyed(QObject *childContextObject) +{ + if (!contextData) + return; + + for (QQmlContextData *ctxt = contextData->childContexts; ctxt; ctxt = ctxt->nextChild) { + if (ctxt->contextObject == childContextObject) + ctxt->contextObject = nullptr; + } +} + //--------------------------------------------------------------------------- diff --git a/src/qml/types/qqmldelegatemodel_p_p.h b/src/qml/types/qqmldelegatemodel_p_p.h index 2d6fdf228e..5e480f4df6 100644 --- a/src/qml/types/qqmldelegatemodel_p_p.h +++ b/src/qml/types/qqmldelegatemodel_p_p.h @@ -106,6 +106,7 @@ public: void referenceObject() { ++objectRef; } bool releaseObject() { return --objectRef == 0 && !(groups & Compositor::PersistedFlag); } bool isObjectReferenced() const { return objectRef != 0 || (groups & Compositor::PersistedFlag); } + void childContextObjectDestroyed(QObject *childContextObject); bool isReferenced() const { return scriptRef |