diff options
-rw-r--r-- | src/quick/items/qquicktableview.cpp | 18 | ||||
-rw-r--r-- | tests/auto/quick/qquicktableview/data/replaceModelTableView.qml | 10 | ||||
-rw-r--r-- | tests/auto/quick/qquicktableview/tst_qquicktableview.cpp | 4 |
3 files changed, 18 insertions, 14 deletions
diff --git a/src/quick/items/qquicktableview.cpp b/src/quick/items/qquicktableview.cpp index e7c6d51cbf..73857af558 100644 --- a/src/quick/items/qquicktableview.cpp +++ b/src/quick/items/qquicktableview.cpp @@ -1054,12 +1054,14 @@ void QQuickTableViewPrivate::releaseLoadedItems(QQmlTableInstanceModel::Reusable void QQuickTableViewPrivate::releaseItem(FxTableItem *fxTableItem, QQmlTableInstanceModel::ReusableFlag reusableFlag) { Q_Q(QQuickTableView); + // Note that fxTableItem->item might already have been destroyed, in case + // the item is owned by the QML context rather than the model (e.g ObjectModel etc). auto item = fxTableItem->item; - Q_TABLEVIEW_ASSERT(item, fxTableItem->index); if (fxTableItem->ownItem) { + Q_TABLEVIEW_ASSERT(item, fxTableItem->index); delete item; - } else { + } else if (item) { // Only QQmlTableInstanceModel supports reusing items auto releaseFlag = tableModel ? tableModel->release(item, reusableFlag) : @@ -2219,13 +2221,15 @@ void QQuickTableViewPrivate::syncRebuildOptions() void QQuickTableViewPrivate::syncDelegate() { - if (tableModel && assignedDelegate == tableModel->delegate()) + if (!tableModel) { + // Only the tableModel uses the delegate assigned to a + // TableView. DelegateModel has it's own delegate, and + // ObjectModel etc. doesn't use one. return; + } - if (!tableModel) - createWrapperModel(); - - tableModel->setDelegate(assignedDelegate); + if (assignedDelegate != tableModel->delegate()) + tableModel->setDelegate(assignedDelegate); } void QQuickTableViewPrivate::syncModel() diff --git a/tests/auto/quick/qquicktableview/data/replaceModelTableView.qml b/tests/auto/quick/qquicktableview/data/replaceModelTableView.qml index 2b17e055a7..1b6074f5d5 100644 --- a/tests/auto/quick/qquicktableview/data/replaceModelTableView.qml +++ b/tests/auto/quick/qquicktableview/data/replaceModelTableView.qml @@ -11,9 +11,9 @@ Item { ObjectModel { id: om - Rectangle { height: 30; width: 80; color: "red" } - Rectangle { height: 30; width: 80; color: "green" } - Rectangle { height: 30; width: 80; color: "blue" } + Rectangle { implicitHeight: 30; implicitWidth: 80; color: "red" } + Rectangle { implicitHeight: 30; implicitWidth: 80; color: "green" } + Rectangle { implicitHeight: 30; implicitWidth: 80; color: "blue" } } ListModel { @@ -29,8 +29,8 @@ Item { ListElement { name: "Orange" } } delegate: Rectangle { - height: 25 - width: 100 + implicitHeight: 25 + implicitWidth: 100 Text { text: "Name: " + name} } } diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp index d6468f4652..09d1b8ca7c 100644 --- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp +++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp @@ -2708,9 +2708,9 @@ void tst_QQuickTableView::replaceModel() tableView->setProperty("modelId", 0); QTRY_COMPARE(tableView->rows(), 2); tableView->setProperty("modelId", 1); - QTRY_COMPARE(tableView->rows(), 0); + QTRY_COMPARE(tableView->rows(), 3); tableView->setProperty("modelId", 2); - QTRY_COMPARE(tableView->rows(), 0); + QTRY_COMPARE(tableView->rows(), 2); tableView->setProperty("modelId", 0); QTRY_COMPARE(tableView->rows(), 2); } |