From be8675ab01132ffb03b81cc81842775d6a8fa3f9 Mon Sep 17 00:00:00 2001 From: Glenn Watson Date: Mon, 12 Mar 2012 13:20:22 +1000 Subject: Change repeater item to handle model being deleted. The repeater item previously stored a raw QObject pointer in a variant. When this pointer was a dynamic list model element that was deleted, the variant would continue to hold a stale pointer. Change repeater to use a guard object to hold the model when it is a QObject. Continue to use a variant to hold models that are not based on QObject to maintain same semantics. Change-Id: Ie100947132923803263c725e86efa68206382f12 Reviewed-by: Martin Jones --- src/quick/items/qquickrepeater.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/quick/items/qquickrepeater.cpp') diff --git a/src/quick/items/qquickrepeater.cpp b/src/quick/items/qquickrepeater.cpp index d26ebed85e..1f7578c583 100644 --- a/src/quick/items/qquickrepeater.cpp +++ b/src/quick/items/qquickrepeater.cpp @@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE QQuickRepeaterPrivate::QQuickRepeaterPrivate() - : model(0), ownModel(false), inRequest(false), itemCount(0), createFrom(-1) + : model(0), ownModel(false), inRequest(false), dataSourceIsObject(false), itemCount(0), createFrom(-1) { } @@ -175,6 +175,12 @@ QQuickRepeater::~QQuickRepeater() QVariant QQuickRepeater::model() const { Q_D(const QQuickRepeater); + + if (d->dataSourceIsObject) { + QObject *o = d->dataSourceAsObject; + return QVariant::fromValue(o); + } + return d->dataSource; } @@ -194,6 +200,8 @@ void QQuickRepeater::setModel(const QVariant &model) } d->dataSource = model; QObject *object = qvariant_cast(model); + d->dataSourceAsObject = object; + d->dataSourceIsObject = object != 0; QQuickVisualModel *vim = 0; if (object && (vim = qobject_cast(object))) { if (d->ownModel) { -- cgit v1.2.3