From: Alan Alpert Date: Thu, 2 May 2013 00:22:14 +0000 (-0700) Subject: Fix Instantiator response to model change X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=7c0156309eef50b5cfd3e498eaed6d7218dc40f8;p=konrad%2Fqtdeclarative.git Fix Instantiator response to model change Objects were not being created correctly when the model changed after componentComplete. After correcting that the model change can lead to an intermediate count change when the old model is cleared, so a flag is set to ignore intermediate changes fom the QQmlDelegateModel when the model changes. Task-number: QTBUG-30379 Change-Id: I55519c9ee378a1b0569567137ebd378f32a6c85c Reviewed-by: Caroline Chao Reviewed-by: Christopher Adams Reviewed-by: Gabriel de Dietrich --- diff --git a/src/qml/types/qqmlinstantiator.cpp b/src/qml/types/qqmlinstantiator.cpp index a2a1fa2..234494e 100644 --- a/src/qml/types/qqmlinstantiator.cpp +++ b/src/qml/types/qqmlinstantiator.cpp @@ -52,6 +52,7 @@ QT_BEGIN_NAMESPACE QQmlInstantiatorPrivate::QQmlInstantiatorPrivate() : componentComplete(true) + , effectiveReset(false) , active(true) , async(false) , ownModel(false) @@ -124,7 +125,7 @@ void QQmlInstantiatorPrivate::_q_modelUpdated(const QQmlChangeSet &changeSet, bo { Q_Q(QQmlInstantiator); - if (componentComplete) + if (!componentComplete || effectiveReset) return; if (reset) { @@ -162,7 +163,7 @@ void QQmlInstantiatorPrivate::_q_modelUpdated(const QQmlChangeSet &changeSet, bo objects = objects.mid(0, index) + movedObjects + objects.mid(index); } else for (int i = 0; i < insert.count; ++i) { int modelIndex = index + i; - QObject* obj = instanceModel->object(i, async); + QObject* obj = instanceModel->object(modelIndex, async); if (obj) _q_createdItem(modelIndex, obj); } @@ -378,8 +379,11 @@ void QQmlInstantiator::setModel(const QVariant &v) if (!d->ownModel) d->makeModel(); - if (QQmlDelegateModel *dataModel = qobject_cast(d->instanceModel)) + if (QQmlDelegateModel *dataModel = qobject_cast(d->instanceModel)) { + d->effectiveReset = true; dataModel->setModel(v); + d->effectiveReset = false; + } } if (d->instanceModel != prevModel) { diff --git a/src/qml/types/qqmlinstantiator_p_p.h b/src/qml/types/qqmlinstantiator_p_p.h index 7945929..ac25ce8 100644 --- a/src/qml/types/qqmlinstantiator_p_p.h +++ b/src/qml/types/qqmlinstantiator_p_p.h @@ -76,6 +76,7 @@ public: void _q_modelUpdated(const QQmlChangeSet &, bool); bool componentComplete; + bool effectiveReset; bool active; bool async; bool ownModel;