diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-05-02 16:03:57 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-05-02 14:14:05 +0000 |
commit | b7e022e323e6064cff146268802bfc4af0fc6135 (patch) | |
tree | 7844c87f9303a4fee1ceacaa210c471908aeae1e /src/templates | |
parent | 891afc345ba854414f5084b1b08eccb66eeaf54a (diff) |
QQuickContainer: fix invalid reads reported by Valgrind
Change-Id: I52cf46dab51382c9184a9dda7107154e52df74ef
Task-number: QTBUG-52731
Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
Diffstat (limited to 'src/templates')
-rw-r--r-- | src/templates/qquickcontainer.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/templates/qquickcontainer.cpp b/src/templates/qquickcontainer.cpp index 841eae8a..58337752 100644 --- a/src/templates/qquickcontainer.cpp +++ b/src/templates/qquickcontainer.cpp @@ -78,16 +78,24 @@ void QQuickContainerPrivate::init() void QQuickContainerPrivate::cleanup() { + Q_Q(QQuickContainer); // ensure correct destruction order (QTBUG-46798) - delete contentItem; const int count = contentModel->count(); for (int i = 0; i < count; ++i) { QQuickItem *item = itemAt(i); - if (item) { - QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent); - delete item; - } + if (item) + QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent | QQuickItemPrivate::SiblingOrder); } + + QQuickItem *focusItem = QQuickItemPrivate::get(contentItem)->subFocusItem; + if (focusItem && window) + QQuickWindowPrivate::get(window)->clearFocusInScope(contentItem, focusItem, Qt::OtherFocusReason); + + q->contentItemChange(Q_NULLPTR, contentItem); + delete contentItem; + + QObject::disconnect(contentModel, &QQmlObjectModel::countChanged, q, &QQuickContainer::countChanged); + QObject::disconnect(contentModel, &QQmlObjectModel::childrenChanged, q, &QQuickContainer::contentChildrenChanged); delete contentModel; } @@ -106,7 +114,7 @@ void QQuickContainerPrivate::insertItem(int index, QQuickItem *item) updatingCurrent = true; item->setParentItem(effectiveContentItem(contentItem)); - QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent); + QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent | QQuickItemPrivate::SiblingOrder); contentModel->insert(index, item); q->itemAdded(index, item); @@ -154,7 +162,7 @@ void QQuickContainerPrivate::removeItem(int index, QQuickItem *item) currentChanged = true; } - QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent); + QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Destroyed | QQuickItemPrivate::Parent | QQuickItemPrivate::SiblingOrder); item->setParentItem(Q_NULLPTR); contentModel->remove(index); @@ -212,12 +220,10 @@ void QQuickContainerPrivate::contentData_append(QQmlListProperty<QObject> *prop, QQuickContainer *q = static_cast<QQuickContainer *>(prop->object); QQuickItem *item = qobject_cast<QQuickItem *>(obj); if (item) { - if (QQuickItemPrivate::get(item)->isTransparentForPositioner()) { - QQuickItemPrivate::get(item)->addItemChangeListener(p, QQuickItemPrivate::SiblingOrder); + if (QQuickItemPrivate::get(item)->isTransparentForPositioner()) item->setParentItem(effectiveContentItem(p->contentItem)); - } else if (p->contentModel->indexOf(item, Q_NULLPTR) == -1) { + else if (p->contentModel->indexOf(item, Q_NULLPTR) == -1) q->addItem(item); - } } else { p->contentData.append(obj); } |