aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2018-07-12 14:38:32 +0200
committerMitch Curtis <mitch.curtis@qt.io>2018-07-17 18:03:20 +0000
commite792c08ef2bb4d4676df2fe7cc4537ea993d07d2 (patch)
tree5291ba3613758ac0e12d303aafb6214cbbb8d99e
parent197c22be541e18b3e8db0d259d4a3e7be3030bb9 (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.cpp7
-rw-r--r--src/quick/items/qquicktableview_p_p.h1
-rw-r--r--tests/auto/quick/qquicktableview/testmodel.h44
-rw-r--r--tests/auto/quick/qquicktableview/tst_qquicktableview.cpp54
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"