summaryrefslogtreecommitdiffstats
path: root/src/widgets/itemviews/qtableview.cpp
diff options
context:
space:
mode:
authorThorbjørn Martsum <tmartsum@gmail.com>2013-03-09 21:15:28 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-05-09 06:44:54 +0200
commit03c5eacfbb7f8fa294368bff812428680a0b9f3b (patch)
treebc1f99e57d56a46798500b44af6fe44b4055f358 /src/widgets/itemviews/qtableview.cpp
parent929e08a3d6bbc4ea16be69b732a3df5191e66474 (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.cpp10
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;