diff options
author | Thorbjørn Martsum <tmartsum@gmail.com> | 2013-03-09 21:15:28 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-05-09 06:44:54 +0200 |
commit | 03c5eacfbb7f8fa294368bff812428680a0b9f3b (patch) | |
tree | bc1f99e57d56a46798500b44af6fe44b4055f358 /src/widgets/itemviews/qtableview.cpp | |
parent | 929e08a3d6bbc4ea16be69b732a3df5191e66474 (diff) |
resizeToContents - QTableView - faster hint when view is hidden
In some situations we can get into resizeSections in a hidden
QHeaderView. If the headerView is hidden then we look at all the
rows, and that can be extemely expensive for a large model.
This patch limits the sizeHint with only looking at a maximum
1000 rows. Though this is more inaccurate it is also faster -
and it is not much different from what QTreeView does.
Change-Id: Ief4b54c5a3c5a0db02e8b595c9b9b3162633ee67
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
Diffstat (limited to 'src/widgets/itemviews/qtableview.cpp')
-rw-r--r-- | src/widgets/itemviews/qtableview.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp index e581188f0a..8550e6fd84 100644 --- a/src/widgets/itemviews/qtableview.cpp +++ b/src/widgets/itemviews/qtableview.cpp @@ -2180,6 +2180,7 @@ int QTableView::sizeHintForRow(int row) const return -1; ensurePolished(); + const int maximumProcessCols = 1000; // To avoid this to take forever. int left = qMax(0, d->horizontalHeader->visualIndexAt(0)); int right = d->horizontalHeader->visualIndexAt(d->viewport->width()); @@ -2190,6 +2191,7 @@ int QTableView::sizeHintForRow(int row) const int hint = 0; QModelIndex index; + int columnsProcessed = 0; for (int column = left; column <= right; ++column) { int logicalColumn = d->horizontalHeader->logicalIndex(column); if (d->horizontalHeader->isSectionHidden(logicalColumn)) @@ -2211,6 +2213,9 @@ int QTableView::sizeHintForRow(int row) const } hint = qMax(hint, itemDelegate(index)->sizeHint(option, index).height()); + ++columnsProcessed; + if (columnsProcessed == maximumProcessCols) + break; } return d->showGrid ? hint + 1 : hint; @@ -2239,6 +2244,7 @@ int QTableView::sizeHintForColumn(int column) const return -1; ensurePolished(); + const int maximumProcessRows = 1000; // To avoid this to take forever. int top = qMax(0, d->verticalHeader->visualIndexAt(0)); int bottom = d->verticalHeader->visualIndexAt(d->viewport->height()); @@ -2248,6 +2254,7 @@ int QTableView::sizeHintForColumn(int column) const QStyleOptionViewItem option = d->viewOptions(); int hint = 0; + int rowsProcessed = 0; QModelIndex index; for (int row = top; row <= bottom; ++row) { int logicalRow = d->verticalHeader->logicalIndex(row); @@ -2264,6 +2271,9 @@ int QTableView::sizeHintForColumn(int column) const } hint = qMax(hint, itemDelegate(index)->sizeHint(option, index).width()); + ++rowsProcessed; + if (rowsProcessed == maximumProcessRows) + break; } return d->showGrid ? hint + 1 : hint; |