diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-12-10 01:01:06 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-12-10 01:01:06 +0100 |
commit | 9dee7b331c4139cadd649da3e90a716447da4134 (patch) | |
tree | b3091c9e33c92b4a41dc6d4515ec541d81a0de76 /src/quick | |
parent | b753d40f67e20031a307d0fe016d63e3a1463f14 (diff) | |
parent | 7f0faddfed02707f49ab9af33e55518f17c56420 (diff) |
Merge remote-tracking branch 'origin/5.14' into 5.15
Change-Id: Iadbdd0fb63ca2a9e0b186343f8b730e4114cd71b
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/items/qquicktableview.cpp | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/src/quick/items/qquicktableview.cpp b/src/quick/items/qquicktableview.cpp index f1002badd1..4018ce33a5 100644 --- a/src/quick/items/qquicktableview.cpp +++ b/src/quick/items/qquicktableview.cpp @@ -628,6 +628,12 @@ void QQuickTableViewPrivate::updateContentWidth() return; } + if (loadedItems.isEmpty()) { + QBoolBlocker fixupGuard(inUpdateContentSize, true); + q->QQuickFlickable::setContentWidth(0); + return; + } + const int nextColumn = nextVisibleEdgeIndexAroundLoadedTable(Qt::RightEdge); const int columnsRemaining = nextColumn == kEdgeIndexAtEnd ? 0 : tableSize.width() - nextColumn; const qreal remainingColumnWidths = columnsRemaining * averageEdgeSize.width(); @@ -655,6 +661,12 @@ void QQuickTableViewPrivate::updateContentHeight() return; } + if (loadedItems.isEmpty()) { + QBoolBlocker fixupGuard(inUpdateContentSize, true); + q->QQuickFlickable::setContentHeight(0); + return; + } + const int nextRow = nextVisibleEdgeIndexAroundLoadedTable(Qt::BottomEdge); const int rowsRemaining = nextRow == kEdgeIndexAtEnd ? 0 : tableSize.height() - nextRow; const qreal remainingRowHeights = rowsRemaining * averageEdgeSize.height(); @@ -1054,12 +1066,14 @@ void QQuickTableViewPrivate::releaseLoadedItems(QQmlTableInstanceModel::Reusable void QQuickTableViewPrivate::releaseItem(FxTableItem *fxTableItem, QQmlTableInstanceModel::ReusableFlag reusableFlag) { Q_Q(QQuickTableView); + // Note that fxTableItem->item might already have been destroyed, in case + // the item is owned by the QML context rather than the model (e.g ObjectModel etc). auto item = fxTableItem->item; - Q_TABLEVIEW_ASSERT(item, fxTableItem->index); if (fxTableItem->ownItem) { + Q_TABLEVIEW_ASSERT(item, fxTableItem->index); delete item; - } else { + } else if (item) { // Only QQmlTableInstanceModel supports reusing items auto releaseFlag = tableModel ? tableModel->release(item, reusableFlag) : @@ -1609,6 +1623,8 @@ void QQuickTableViewPrivate::processRebuildTable() if (rebuildState == RebuildState::VerifyTable) { if (loadedItems.isEmpty()) { qCDebug(lcTableViewDelegateLifecycle()) << "no items loaded!"; + updateContentWidth(); + updateContentHeight(); rebuildState = RebuildState::Done; } else if (!moveToNextRebuildState()) { return; @@ -1781,10 +1797,12 @@ void QQuickTableViewPrivate::beginRebuildTable() QPointF topLeftPos; calculateTopLeft(topLeft, topLeftPos); - if (rebuildOptions & RebuildOption::All) - releaseLoadedItems(QQmlTableInstanceModel::NotReusable); - else if (rebuildOptions & RebuildOption::ViewportOnly) - releaseLoadedItems(reusableFlag); + if (!loadedItems.isEmpty()) { + if (rebuildOptions & RebuildOption::All) + releaseLoadedItems(QQmlTableInstanceModel::NotReusable); + else if (rebuildOptions & RebuildOption::ViewportOnly) + releaseLoadedItems(reusableFlag); + } if (rebuildOptions & RebuildOption::All) { origin = QPointF(0, 0); @@ -2216,13 +2234,15 @@ void QQuickTableViewPrivate::syncRebuildOptions() void QQuickTableViewPrivate::syncDelegate() { - if (tableModel && assignedDelegate == tableModel->delegate()) + if (!tableModel) { + // Only the tableModel uses the delegate assigned to a + // TableView. DelegateModel has it's own delegate, and + // ObjectModel etc. doesn't use one. return; + } - if (!tableModel) - createWrapperModel(); - - tableModel->setDelegate(assignedDelegate); + if (assignedDelegate != tableModel->delegate()) + tableModel->setDelegate(assignedDelegate); } void QQuickTableViewPrivate::syncModel() @@ -2230,8 +2250,10 @@ void QQuickTableViewPrivate::syncModel() if (modelVariant == assignedModel) return; - if (model) + if (model) { disconnectFromModel(); + releaseLoadedItems(QQmlTableInstanceModel::NotReusable); + } modelVariant = assignedModel; QVariant effectiveModelVariant = modelVariant; @@ -2242,7 +2264,6 @@ void QQuickTableViewPrivate::syncModel() if (instanceModel) { if (tableModel) { - releaseLoadedItems(QQmlTableInstanceModel::NotReusable); delete tableModel; tableModel = nullptr; } |