diff options
author | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2019-10-22 15:30:20 +0200 |
---|---|---|
committer | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2019-11-12 14:46:41 +0100 |
commit | 8952800c68743d0c98e3f638a5bafef1e78fa1d9 (patch) | |
tree | 5650a01d792b7d5897c4ce1622df813827be0d9f /tests/auto/quick/qquicktableview/tst_qquicktableview.cpp | |
parent | 06267f90a2ec6e67c754f1b9fd2a516c37fd784e (diff) |
QQuickTableView::forceLayout(): rebuild table if the size of the model has changed
An assert will trigger if forceLayout() is called while the model is
being reset. The reason is that the forceLayout() schedules a relayout
which assumes that the size of the model hasn't changed. But while
layouting, it will try to fetch data from the model according to the
old size, which will trigger an assert.
This patch will add an extra path to forceLayout() that checks if the
size of the model has changed, and if so, schedule a complete
rebuild instead of just a relayout.
Fixes: QTBUG-79395
Change-Id: If61658912d9e90c1a5aef9bc28083da20fa6ec76
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 | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp index 889175a228..1b5be0232c 100644 --- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp +++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp @@ -120,6 +120,7 @@ private slots: void checkRowHeightProviderNotCallable(); void checkForceLayoutFunction(); void checkForceLayoutEndUpDoingALayout(); + void checkForceLayoutDuringModelChange(); void checkContentWidthAndHeight(); void checkPageFlicking(); void checkExplicitContentWidthAndHeight(); @@ -587,6 +588,29 @@ void tst_QQuickTableView::checkForceLayoutEndUpDoingALayout() QCOMPARE(fxItem->item->height(), newDelegateSize); } +void tst_QQuickTableView::checkForceLayoutDuringModelChange() +{ + // Check that TableView doesn't assert if we call + // forceLayout() in the middle of a model change. + LOAD_TABLEVIEW("plaintableview.qml"); + + const int initialRowCount = 10; + TestModel model(initialRowCount, 10); + tableView->setModel(QVariant::fromValue(&model)); + + connect(&model, &QAbstractItemModel::rowsInserted, [=](){ + QCOMPARE(tableView->rows(), initialRowCount); + tableView->forceLayout(); + QCOMPARE(tableView->rows(), initialRowCount + 1); + }); + + WAIT_UNTIL_POLISHED; + + QCOMPARE(tableView->rows(), initialRowCount); + model.addRow(0); + QCOMPARE(tableView->rows(), initialRowCount + 1); +} + void tst_QQuickTableView::checkContentWidthAndHeight() { // Check that contentWidth/Height reports the correct size of the |