aboutsummaryrefslogtreecommitdiffstats
path: root/src/templates
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-05-02 16:03:57 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-05-02 14:14:05 +0000
commitb7e022e323e6064cff146268802bfc4af0fc6135 (patch)
tree7844c87f9303a4fee1ceacaa210c471908aeae1e /src/templates
parent891afc345ba854414f5084b1b08eccb66eeaf54a (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.cpp28
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);
}