From e792c08ef2bb4d4676df2fe7cc4537ea993d07d2 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Thu, 12 Jul 2018 14:38:32 +0200 Subject: TableView: invalidate table when model is reset Signals like rowsInserted() were already accounted for in QQuickTableViewPrivate::connectToModel(), but modelReset() was not. Change-Id: I6b8248d745d507d4ea846e9bee717182915792b3 Reviewed-by: Richard Moe Gustavsen --- tests/auto/quick/qquicktableview/testmodel.h | 44 ++++++++++++++++++ .../quick/qquicktableview/tst_qquicktableview.cpp | 54 ++++++++++++++++++++++ 2 files changed, 98 insertions(+) (limited to 'tests/auto/quick/qquicktableview') diff --git a/tests/auto/quick/qquicktableview/testmodel.h b/tests/auto/quick/qquicktableview/testmodel.h index 06384f7a5e..211beee9cb 100644 --- a/tests/auto/quick/qquicktableview/testmodel.h +++ b/tests/auto/quick/qquicktableview/testmodel.h @@ -76,6 +76,50 @@ public: emit dataChanged(index, index); } + bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override + { + if (row < 0 || count <= 0) + return false; + + beginInsertRows(parent, row, row + count - 1); + m_rows += count; + endInsertRows(); + return true; + } + + bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override + { + if (!checkIndex(createIndex(row, 0)) || !checkIndex(createIndex(row + count - 1, 0))) + return false; + + beginRemoveRows(parent, row, row + count - 1); + m_rows -= count; + endRemoveRows(); + return true; + } + + bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override + { + if (column < 0 || count <= 0) + return false; + + beginInsertColumns(parent, column, column + count - 1); + m_columns += count; + endInsertColumns(); + return true; + } + + bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override + { + if (!checkIndex(createIndex(0, column)) || !checkIndex(createIndex(0, column + count - 1))) + return false; + + beginRemoveColumns(parent, column, column + count - 1); + m_columns -= count; + endRemoveColumns(); + return true; + } + signals: void rowCountChanged(); void columnCountChanged(); diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp index a725a125c2..2a6179847d 100644 --- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp +++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp @@ -101,6 +101,7 @@ private slots: void flickOvershoot_data(); void flickOvershoot(); void checkRowColumnCount(); + void modelSignals(); }; tst_QQuickTableView::tst_QQuickTableView() @@ -780,6 +781,59 @@ void tst_QQuickTableView::checkRowColumnCount() QCOMPARE(qmlCountAfterUpFlick, qmlCountAfterInit); } +void tst_QQuickTableView::modelSignals() +{ + LOAD_TABLEVIEW("plaintableview.qml"); + + TestModel model(1, 1); + tableView->setModel(QVariant::fromValue(&model)); + WAIT_UNTIL_POLISHED; + QCOMPARE(tableView->rows(), 1); + QCOMPARE(tableView->columns(), 1); + + QVERIFY(model.insertRows(0, 1)); + WAIT_UNTIL_POLISHED; + QCOMPARE(tableView->rows(), 2); + QCOMPARE(tableView->columns(), 1); + + QVERIFY(model.removeRows(1, 1)); + WAIT_UNTIL_POLISHED; + QCOMPARE(tableView->rows(), 1); + QCOMPARE(tableView->columns(), 1); + + model.insertColumns(1, 1); + WAIT_UNTIL_POLISHED; + QCOMPARE(tableView->rows(), 1); + QCOMPARE(tableView->columns(), 2); + + model.removeColumns(1, 1); + WAIT_UNTIL_POLISHED; + QCOMPARE(tableView->rows(), 1); + QCOMPARE(tableView->columns(), 1); + + model.setRowCount(10); + WAIT_UNTIL_POLISHED; + QCOMPARE(tableView->rows(), 10); + QCOMPARE(tableView->columns(), 1); + + model.setColumnCount(10); + WAIT_UNTIL_POLISHED; + QCOMPARE(tableView->rows(), 10); + QCOMPARE(tableView->columns(), 10); + + model.setRowCount(0); + WAIT_UNTIL_POLISHED; + QCOMPARE(tableView->rows(), 0); + QCOMPARE(tableView->columns(), 10); + + model.setColumnCount(0); + // TODO: When the QAbstractItemModel's column count is set to 0, + // QQmlAdaptorModel::columnCount() likes to return whatever it was previously, + // even though the model doesn't actually have any columns... not sure what to do about that. + QCOMPARE(tableView->rows(), 0); + QCOMPARE(tableView->columns(), 10); +} + QTEST_MAIN(tst_QQuickTableView) #include "tst_qquicktableview.moc" -- cgit v1.2.3