aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquicktableview.cpp18
-rw-r--r--tests/auto/quick/qquicktableview/data/replaceModelTableView.qml10
-rw-r--r--tests/auto/quick/qquicktableview/tst_qquicktableview.cpp4
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);
}