diff options
author | Thorbjørn Lund Martsum <tmartsum@gmail.com> | 2017-09-01 20:45:27 +0200 |
---|---|---|
committer | Thorbjørn Lund Martsum <tmartsum@gmail.com> | 2021-08-10 12:00:13 +0200 |
commit | 7502598ef5bfa3f1a6d4f435bc2b91914e3acc61 (patch) | |
tree | 66db85b10f0f35a8f9eef654328c0e00d3b4c8c4 /src/widgets/itemviews | |
parent | 0e92ec972840e78b6f38d0f554ec1554edf752d1 (diff) |
QListView: fix AdjustToContents (sizeAdjustPolicy)
Unlike an acceptable effect in QTableView + QTreeView
setAdjustPolicy(QAbstractScrollArea::AdjustToContents)
unfortunately didn't work for QListViews (and QListWidget).
This patch corrects QListViews AdjustToContents
behavior.
[ChangeLog][QtWidgets][QListView] A more correct implementation
of QListView::viewportSizeHint has been made. That
implies that setting the sizeAdjustPolicy to AdjustToContent
on QListView and QListWidget will now cause the view to
size after the contents and avoid scrollbars.
Pick-to: 6.2
Task-number: QTBUG-58749
Change-Id: I1675115f2348e2fcf0b2c39b451ef337e10eb872
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src/widgets/itemviews')
-rw-r--r-- | src/widgets/itemviews/qlistview.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index 9b3221f84e..68d5d7612f 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -3487,7 +3487,47 @@ int QListView::visualIndex(const QModelIndex &index) const */ QSize QListView::viewportSizeHint() const { - return QAbstractItemView::viewportSizeHint(); + Q_D(const QListView); + // We don't have a nice simple size hint for invalid or wrapping list views. + if (!d->model) + return QAbstractItemView::viewportSizeHint(); + const int rc = d->model->rowCount(); + if (rc == 0 || isWrapping()) + return QAbstractItemView::viewportSizeHint(); + + QStyleOptionViewItem option; + initViewItemOption(&option); + + if (uniformItemSizes()) { + QSize sz = d->cachedItemSize; + if (!sz.isValid()) { + QModelIndex idx = d->model->index(0, d->column, d->root); + sz = d->itemSize(option, idx); + } + sz.setHeight(rc * sz.height()); + return sz; + } + + // Using AdjustToContents with a high number of rows will normally not make sense, so we limit + // this to default 1000 (that is btw the default for QHeaderView::resizeContentsPrecision()) + // (By setting the property _q_resizeContentPrecision the user can however override this). + int maximumRows = 1000; + const QVariant userOverrideValue = property("_q_resizeContentPrecision"); + if (userOverrideValue.isValid() && userOverrideValue.toInt() > 0) { + maximumRows = userOverrideValue.toInt(); + } + const int rowCount = qMin(rc, maximumRows); + + int h = 0; + int w = 0; + + for (int row = 0; row < rowCount; ++row) { + QModelIndex idx = d->model->index(row, d->column, d->root); + QSize itemSize = d->itemSize(option, idx); + h += itemSize.height(); + w = qMax(w, itemSize.width()); + } + return QSize(w, h); } QT_END_NAMESPACE |