aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlmodels/qqmltableinstancemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmlmodels/qqmltableinstancemodel.cpp')
-rw-r--r--src/qmlmodels/qqmltableinstancemodel.cpp47
1 files changed, 27 insertions, 20 deletions
diff --git a/src/qmlmodels/qqmltableinstancemodel.cpp b/src/qmlmodels/qqmltableinstancemodel.cpp
index e145702463..39102c27c9 100644
--- a/src/qmlmodels/qqmltableinstancemodel.cpp
+++ b/src/qmlmodels/qqmltableinstancemodel.cpp
@@ -29,13 +29,7 @@ void QQmlTableInstanceModel::deleteModelItemLater(QQmlDelegateModelItem *modelIt
delete modelItem->object;
modelItem->object = nullptr;
-
- if (modelItem->contextData) {
- modelItem->contextData->invalidate();
- Q_ASSERT(modelItem->contextData->refCount() == 1);
- modelItem->contextData = nullptr;
- }
-
+ modelItem->contextData.reset();
modelItem->deleteLater();
}
@@ -67,8 +61,7 @@ QQmlTableInstanceModel::~QQmlTableInstanceModel()
if (modelItem->object) {
delete modelItem->object;
modelItem->object = nullptr;
- modelItem->contextData->invalidate();
- modelItem->contextData = nullptr;
+ modelItem->contextData.reset();
}
}
@@ -295,17 +288,31 @@ void QQmlTableInstanceModel::incubateModelItem(QQmlDelegateModelItem *modelItem,
modelItem->incubationTask = new QQmlTableInstanceModelIncubationTask(this, modelItem, incubationMode);
QQmlContext *creationContext = modelItem->delegate->creationContext();
- QQmlRefPointer<QQmlContextData> ctxt = QQmlContextData::createRefCounted(
- QQmlContextData::get(creationContext ? creationContext : m_qmlContext.data()));
- ctxt->setContextObject(modelItem);
- modelItem->contextData = ctxt;
-
- QQmlComponentPrivate::get(modelItem->delegate)->incubateObject(
- modelItem->incubationTask,
- modelItem->delegate,
- m_qmlContext->engine(),
- ctxt,
- QQmlContextData::get(m_qmlContext));
+ const QQmlRefPointer<QQmlContextData> componentContext
+ = QQmlContextData::get(creationContext ? creationContext : m_qmlContext.data());
+
+ QQmlComponentPrivate *cp = QQmlComponentPrivate::get(modelItem->delegate);
+ if (cp->isBound()) {
+ modelItem->contextData = componentContext;
+ cp->incubateObject(
+ modelItem->incubationTask,
+ modelItem->delegate,
+ m_qmlContext->engine(),
+ componentContext,
+ QQmlContextData::get(m_qmlContext));
+ } else {
+ QQmlRefPointer<QQmlContextData> ctxt = QQmlContextData::createRefCounted(
+ QQmlContextData::get(creationContext ? creationContext : m_qmlContext.data()));
+ ctxt->setContextObject(modelItem);
+ modelItem->contextData = ctxt;
+
+ cp->incubateObject(
+ modelItem->incubationTask,
+ modelItem->delegate,
+ m_qmlContext->engine(),
+ ctxt,
+ QQmlContextData::get(m_qmlContext));
+ }
}
// Remove the temporary guard