From b8a85408d943bffba403d783b9082bd279460bed Mon Sep 17 00:00:00 2001 From: Yulong Bai Date: Wed, 19 Jun 2019 15:05:28 +0200 Subject: QQuickItemView: fix crash while doing fast flicking in transitions The cause was that fast flicking kicked items in and out of viewport, while in transition, they would abruptly having tracking data structure , i.e. releasePendingTransition of QQuickItemViewPrivate, got iterator invalidated. This also helps to resolve QTBUG-44308. Fixes: QTBUG-76433 Fixes: QTBUG-44308 Change-Id: If14533d3f6b1acd7b6ca0c5c723347c0cb3f54dc Reviewed-by: Frederik Gladhorn --- src/quick/items/qquickitemview.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'src/quick/items/qquickitemview.cpp') diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 2e1962bc7b..eead84d51e 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1874,15 +1874,21 @@ void QQuickItemViewPrivate::layout() prepareVisibleItemTransitions(); - for (QList::Iterator it = releasePendingTransition.begin(); - it != releasePendingTransition.end(); ) { - FxViewItem *item = *it; - if (prepareNonVisibleItemTransition(item, viewBounds)) { - ++it; - } else { - releaseItem(item); + for (auto it = releasePendingTransition.begin(); it != releasePendingTransition.end(); ) { + auto old_count = releasePendingTransition.count(); + auto success = prepareNonVisibleItemTransition(*it, viewBounds); + // prepareNonVisibleItemTransition() may invalidate iterators while in fast flicking + // invisible animating items are kicked in or out the viewPort + // use old_count to test if the abrupt erasure occurs + if (old_count > releasePendingTransition.count()) { + continue; + } + if (!success) { + releaseItem(*it); it = releasePendingTransition.erase(it); + continue; } + ++it; } for (int i=0; i Date: Fri, 21 Jun 2019 15:12:36 +0200 Subject: Fix: ListView footer positioned wrong after last item removed The refill() method would bail out early on an empty model. Make sure that it at least updates the header and footer in such situations. Fixes: QTBUG-31677 Change-Id: I1f3a1848ff263a8f7f9ccfc3b20f16b61348f57b Reviewed-by: Mitch Curtis --- src/quick/items/qquickitemview.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/quick/items/qquickitemview.cpp') diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index eead84d51e..d0715cdb7f 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1717,8 +1717,14 @@ void QQuickItemViewPrivate::refill() void QQuickItemViewPrivate::refill(qreal from, qreal to) { Q_Q(QQuickItemView); - if (!isValid() || !q->isComponentComplete()) + if (!model || !model->isValid() || !q->isComponentComplete()) return; + if (!model->count()) { + updateHeader(); + updateFooter(); + updateViewport(); + return; + } do { bufferPause.stop(); -- cgit v1.2.3