diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2018-07-12 14:38:32 +0200 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2018-07-17 18:03:20 +0000 |
commit | e792c08ef2bb4d4676df2fe7cc4537ea993d07d2 (patch) | |
tree | 5291ba3613758ac0e12d303aafb6214cbbb8d99e | |
parent | 197c22be541e18b3e8db0d259d4a3e7be3030bb9 (diff) |
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 <richard.gustavsen@qt.io>
-rw-r--r-- | src/quick/items/qquicktableview.cpp | 7 | ||||
-rw-r--r-- | src/quick/items/qquicktableview_p_p.h | 1 | ||||
-rw-r--r-- | tests/auto/quick/qquicktableview/testmodel.h | 44 | ||||
-rw-r--r-- | tests/auto/quick/qquicktableview/tst_qquicktableview.cpp | 54 |
4 files changed, 106 insertions, 0 deletions
diff --git a/src/quick/items/qquicktableview.cpp b/src/quick/items/qquicktableview.cpp index 92f45cd151..4165b52381 100644 --- a/src/quick/items/qquicktableview.cpp +++ b/src/quick/items/qquicktableview.cpp @@ -1229,6 +1229,7 @@ void QQuickTableViewPrivate::connectToModel() connect(aim, &QAbstractItemModel::rowsRemoved, this, &QQuickTableViewPrivate::rowsRemovedCallback); connect(aim, &QAbstractItemModel::columnsInserted, this, &QQuickTableViewPrivate::columnsInsertedCallback); connect(aim, &QAbstractItemModel::columnsRemoved, this, &QQuickTableViewPrivate::columnsRemovedCallback); + connect(aim, &QAbstractItemModel::modelReset, this, &QQuickTableViewPrivate::modelResetCallback); } else { QObjectPrivate::connect(model, &QQmlInstanceModel::modelUpdated, this, &QQuickTableViewPrivate::modelUpdated); } @@ -1247,6 +1248,7 @@ void QQuickTableViewPrivate::disconnectFromModel() disconnect(aim, &QAbstractItemModel::rowsRemoved, this, &QQuickTableViewPrivate::rowsRemovedCallback); disconnect(aim, &QAbstractItemModel::columnsInserted, this, &QQuickTableViewPrivate::columnsInsertedCallback); disconnect(aim, &QAbstractItemModel::columnsRemoved, this, &QQuickTableViewPrivate::columnsRemovedCallback); + disconnect(aim, &QAbstractItemModel::modelReset, this, &QQuickTableViewPrivate::modelResetCallback); } else { QObjectPrivate::disconnect(model, &QQmlInstanceModel::modelUpdated, this, &QQuickTableViewPrivate::modelUpdated); } @@ -1301,6 +1303,11 @@ void QQuickTableViewPrivate::columnsRemovedCallback(const QModelIndex &parent, i invalidateTable(); } +void QQuickTableViewPrivate::modelResetCallback() +{ + invalidateTable(); +} + QQuickTableView::QQuickTableView(QQuickItem *parent) : QQuickFlickable(*(new QQuickTableViewPrivate), parent) { diff --git a/src/quick/items/qquicktableview_p_p.h b/src/quick/items/qquicktableview_p_p.h index 4dcf421183..b11afb1e5a 100644 --- a/src/quick/items/qquicktableview_p_p.h +++ b/src/quick/items/qquicktableview_p_p.h @@ -324,6 +324,7 @@ public: void rowsRemovedCallback(const QModelIndex &parent, int begin, int end); void columnsInsertedCallback(const QModelIndex &parent, int begin, int end); void columnsRemovedCallback(const QModelIndex &parent, int begin, int end); + void modelResetCallback(); inline QString tableLayoutToString() const; void dumpTable() const; 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" |