diff options
author | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2018-08-01 22:53:17 +0200 |
---|---|---|
committer | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2018-08-02 15:53:58 +0000 |
commit | fe1a259be66835bc937890f3ed62bb2e8496d0f1 (patch) | |
tree | 12453b09306764e679cb45af9de417c38101f572 /tests/auto/quick/qquicktableview/tst_qquicktableview.cpp | |
parent | e997cd013a665505bd2d33a3e4b76e27752bcb39 (diff) |
QQmlTableInstanceModel: handle model data changes more gracefully
Equal to QQmlDelegateModel, we need to listen for changes done to
existing model items, and notify existing delegate items about it.
Otherwise, they will not stay in sync with the model.
By accident, this sort of worked in QQuickTableView already, since
it would rebuild the whole table for every model update. This
is really slow, and completely unnecessary.
Change-Id: I10750ff387f8b455d0f27c50a17926d9beb6dd03
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'tests/auto/quick/qquicktableview/tst_qquicktableview.cpp')
-rw-r--r-- | tests/auto/quick/qquicktableview/tst_qquicktableview.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp index 86839b61dc..bc0990862f 100644 --- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp +++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp @@ -51,6 +51,7 @@ using namespace QQuickVisualTestUtil; static const char* kTableViewPropName = "tableView"; static const char* kDelegateObjectName = "tableViewDelegate"; static const char *kDelegatesCreatedCountProp = "delegatesCreatedCount"; +static const char *kModelDataBindingProp = "modelDataBinding"; Q_DECLARE_METATYPE(QMarginsF); @@ -113,6 +114,7 @@ private slots: void flickOvershoot(); void checkRowColumnCount(); void modelSignals(); + void dataChangedSignal(); void checkIfDelegatesAreReused_data(); void checkIfDelegatesAreReused(); void checkContextProperties_data(); @@ -1113,6 +1115,55 @@ void tst_QQuickTableView::modelSignals() QCOMPARE(tableView->columns(), 1); } +void tst_QQuickTableView::dataChangedSignal() +{ + // Check that bindings to the model inside a delegate gets updated + // when the model item they bind to changes. + LOAD_TABLEVIEW("plaintableview.qml"); + + const QString prefix(QStringLiteral("changed")); + + TestModel model(10, 10); + tableView->setModel(QVariant::fromValue(&model)); + + WAIT_UNTIL_POLISHED; + + for (auto fxItem : tableViewPrivate->loadedItems) { + const auto item = tableViewPrivate->loadedTableItem(fxItem->cell)->item; + const QString modelDataBindingProperty = item->property(kModelDataBindingProp).toString(); + QString expectedModelData = QString::number(fxItem->cell.y()); + QCOMPARE(modelDataBindingProperty, expectedModelData); + } + + // Change one cell in the model + model.setModelData(QPoint(0, 0), QSize(1, 1), prefix); + + for (auto fxItem : tableViewPrivate->loadedItems) { + const QPoint cell = fxItem->cell; + const auto modelIndex = model.index(cell.y(), cell.x()); + QString expectedModelData = model.data(modelIndex, Qt::DisplayRole).toString(); + + const auto item = tableViewPrivate->loadedTableItem(fxItem->cell)->item; + const QString modelDataBindingProperty = item->property(kModelDataBindingProp).toString(); + + QCOMPARE(modelDataBindingProperty, expectedModelData); + } + + // Change four cells in one go + model.setModelData(QPoint(1, 0), QSize(2, 2), prefix); + + for (auto fxItem : tableViewPrivate->loadedItems) { + const QPoint cell = fxItem->cell; + const auto modelIndex = model.index(cell.y(), cell.x()); + QString expectedModelData = model.data(modelIndex, Qt::DisplayRole).toString(); + + const auto item = tableViewPrivate->loadedTableItem(fxItem->cell)->item; + const QString modelDataBindingProperty = item->property(kModelDataBindingProp).toString(); + + QCOMPARE(modelDataBindingProperty, expectedModelData); + } +} + void tst_QQuickTableView::checkIfDelegatesAreReused_data() { QTest::addColumn<bool>("reuseItems"); |