aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickitemview.cpp5
-rw-r--r--tests/auto/quick/qquicklistview/data/objectModelCulling.qml35
-rw-r--r--tests/auto/quick/qquicklistview/tst_qquicklistview.cpp25
3 files changed, 63 insertions, 2 deletions
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp
index 7fb392233e..2b4ca9e256 100644
--- a/src/quick/items/qquickitemview.cpp
+++ b/src/quick/items/qquickitemview.cpp
@@ -2452,14 +2452,15 @@ bool QQuickItemViewPrivate::releaseItem(FxViewItem *item, QQmlInstanceModel::Reu
QQmlInstanceModel::ReleaseFlags flags = {};
if (model && item->item) {
flags = model->release(item->item, reusableFlag);
- if (!flags && !isClearing) {
+ if (!flags) {
// item was not destroyed, and we no longer reference it.
if (item->item->parentItem() == contentItem) {
// Only cull the item if its parent item is still our contentItem.
// One case where this can happen is moving an item out of one ObjectModel and into another.
QQuickItemPrivate::get(item->item)->setCulled(true);
}
- unrequestedItems.insert(item->item, model->indexOf(item->item, q));
+ if (!isClearing)
+ unrequestedItems.insert(item->item, model->indexOf(item->item, q));
} else if (flags & QQmlInstanceModel::Destroyed) {
item->item->setParentItem(nullptr);
} else if (flags & QQmlInstanceModel::Pooled) {
diff --git a/tests/auto/quick/qquicklistview/data/objectModelCulling.qml b/tests/auto/quick/qquicklistview/data/objectModelCulling.qml
new file mode 100644
index 0000000000..c0a70ec485
--- /dev/null
+++ b/tests/auto/quick/qquicklistview/data/objectModelCulling.qml
@@ -0,0 +1,35 @@
+import QtQuick 2.12
+
+import QtQml.Models 2.12
+
+Item {
+
+ ObjectModel {
+ id: model1
+ objectName: "model1"
+
+ Rectangle {
+ color: "red"
+ objectName: "redRect"
+ height: 30; width: 80;
+ }
+ }
+
+ ObjectModel {
+ id: model2
+ objectName: "model2"
+
+ Rectangle {
+ color: "green"
+ height: 30; width: 80;
+ x:10
+ }
+ }
+
+ ListView {
+ id: listView
+ objectName: "lv"
+
+ anchors.fill: parent
+ }
+}
diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
index 4e49344bc0..f63793ca80 100644
--- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
+++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
@@ -294,6 +294,7 @@ private slots:
void reuse_checkThatItemsAreReused();
void moveObjectModelItemToAnotherObjectModel();
void changeModelAndDestroyTheOldOne();
+ void objectModelCulling();
void requiredObjectListModel();
@@ -9988,6 +9989,30 @@ void tst_QQuickListView::changeModelAndDestroyTheOldOne() // QTBUG-80203
// no crash
}
+void tst_QQuickListView::objectModelCulling()
+{
+ QScopedPointer<QQuickView> window(createView());
+ window->setSource(testFileUrl("objectModelCulling.qml"));
+ window->resize(640, 480);
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window.data()));
+ QObject *root = window->rootObject();
+ QVERIFY(root);
+ auto listView = root->findChild<QQuickListView *>("lv");
+ QVERIFY(listView);
+ auto model1 = root->findChild<QObject *>("model1");
+ QVERIFY(model1);
+ auto model2 = root->findChild<QObject *>("model2");
+ QVERIFY(model2);
+ auto redRect = root->findChild<QQuickItem *>("redRect");
+ QVERIFY(redRect);
+ auto redRectPriv = QQuickItemPrivate::get(redRect);
+ listView->setModel(QVariant::fromValue(model1));
+ QVERIFY(!redRectPriv->culled);
+ listView->setModel(QVariant::fromValue(model2));
+ QTRY_VERIFY(redRectPriv->culled);
+}
+
class DataObject : public QObject
{
Q_OBJECT