diff options
author | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2020-03-10 21:42:11 +0100 |
---|---|---|
committer | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2020-03-21 07:05:27 +0100 |
commit | 1e03015d551fb1542d43f54f8b64cf721da51913 (patch) | |
tree | 38a22225b7dbca3a9258d7061c5161002f85d001 | |
parent | d55dad94f984333c11a7f01fbd5d8c07e405129f (diff) |
QTableView: Make sure to repaint all needed cells during resizing
Don't try to update the scrollarea geometry while resizing a row or
column since this may lead in flickering and artifacts, esp when the
scroll mode is scrollPerItems. Instead do the calculation only when the
resize is finished.
Fixes: QTBUG-72870
Fixes: QTBUG-82595
Change-Id: Id6903c00485b3be6ed54bd5f9bcafdda6da21598
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Samuel Gaist <samuel.gaist@idiap.ch>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-rw-r--r-- | src/widgets/itemviews/qtableview.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp index 81fceba8dc..a8da6530a4 100644 --- a/src/widgets/itemviews/qtableview.cpp +++ b/src/widgets/itemviews/qtableview.cpp @@ -2939,14 +2939,17 @@ void QTableView::timerEvent(QTimerEvent *event) Q_D(QTableView); if (event->timerId() == d->columnResizeTimerID) { - updateGeometries(); - killTimer(d->columnResizeTimerID); - d->columnResizeTimerID = 0; + const int oldScrollMax = horizontalScrollBar()->maximum(); + if (horizontalHeader()->d_func()->state != QHeaderViewPrivate::ResizeSection) { + updateGeometries(); + killTimer(d->columnResizeTimerID); + d->columnResizeTimerID = 0; + } QRect rect; int viewportHeight = d->viewport->height(); int viewportWidth = d->viewport->width(); - if (d->hasSpans()) { + if (d->hasSpans() || horizontalScrollBar()->value() == oldScrollMax) { rect = QRect(0, 0, viewportWidth, viewportHeight); } else { for (int i = d->columnsToUpdate.size()-1; i >= 0; --i) { @@ -2964,14 +2967,17 @@ void QTableView::timerEvent(QTimerEvent *event) } if (event->timerId() == d->rowResizeTimerID) { - updateGeometries(); - killTimer(d->rowResizeTimerID); - d->rowResizeTimerID = 0; + const int oldScrollMax = verticalScrollBar()->maximum(); + if (verticalHeader()->d_func()->state != QHeaderViewPrivate::ResizeSection) { + updateGeometries(); + killTimer(d->rowResizeTimerID); + d->rowResizeTimerID = 0; + } int viewportHeight = d->viewport->height(); int viewportWidth = d->viewport->width(); int top; - if (d->hasSpans()) { + if (d->hasSpans() || verticalScrollBar()->value() == oldScrollMax) { top = 0; } else { top = viewportHeight; |