diff options
author | Qiang Li <liqianga@uniontech.com> | 2021-03-03 19:26:27 +0800 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2021-03-08 12:31:13 +0000 |
commit | f140ef04a0c54c2c8a699db33433b8d7235d137c (patch) | |
tree | 4f5600dcd9d9e9a5500e6cfe6576cd0b8830a177 /src/widgets/itemviews | |
parent | 6e899f8e8c58e4ff980a8106c72ad522b5a7dc10 (diff) |
Fix the crashes when animated QTreeWidgetItems are hidden
QTreeView's drawTree implementation performs lazy layouting
when calling itemDecorationAt. If animations are enabled,
this can change the list of items, and invalidate the copy
made earlier.
Don't copy the list of items, use a reference instead so that
code iterating over the items later operates on valid data.
Add an assert in the private itemHeight method, it must not
be called with an index that is out of bounds.
Fixes: QTBUG-42469
Pick-to: 6.0 6.1 5.15
Change-Id: Ifdb782881447912e00baffd1c407de10a1d8d0d4
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/widgets/itemviews')
-rw-r--r-- | src/widgets/itemviews/qtreeview.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index c0b0ee4f2d..49585d8b26 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -1486,7 +1486,8 @@ void QTreeViewPrivate::adjustViewOptionsForIndex(QStyleOptionViewItem *option, c void QTreeView::drawTree(QPainter *painter, const QRegion ®ion) const { Q_D(const QTreeView); - const QList<QTreeViewItem> viewItems = d->viewItems; + // d->viewItems changes when posted layouts are executed in itemDecorationAt, so don't copy + const QList<QTreeViewItem> &viewItems = d->viewItems; QStyleOptionViewItem option; initViewItemOption(&option); @@ -3484,6 +3485,7 @@ int QTreeViewPrivate::indentationForItem(int item) const int QTreeViewPrivate::itemHeight(int item) const { + Q_ASSERT(item < viewItems.count()); if (uniformRowHeights) return defaultItemHeight; if (viewItems.isEmpty()) |