From 1782fc1e07619a509ca490b55f0a946537e70b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 4 Dec 2013 16:38:01 +0100 Subject: Prevent recursive resize events in QAbstractScrollArea MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit During show() of a QAbstractScrollArea we might get resize events, which results in laying out the children of the scroll area. One of these children are the scrollbars, and raising them to the top means creating them, which in turn means creating all parents, including the abstract scroll area itself. Creating the abstract scroll area means creating a platform window, which might send synchronous resize events as a result of creating the window, and we end up recursing. Change-Id: I1a2813f03091d6c42e51834315835551cb2fd621 Reviewed-by: Jan Arve Sæther --- src/widgets/widgets/qabstractscrollarea.cpp | 8 ++++++-- src/widgets/widgets/qabstractscrollarea_p.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp index d8ee923f7a..db4ff8a2b7 100644 --- a/src/widgets/widgets/qabstractscrollarea.cpp +++ b/src/widgets/widgets/qabstractscrollarea.cpp @@ -167,7 +167,7 @@ QT_BEGIN_NAMESPACE QAbstractScrollAreaPrivate::QAbstractScrollAreaPrivate() :hbar(0), vbar(0), vbarpolicy(Qt::ScrollBarAsNeeded), hbarpolicy(Qt::ScrollBarAsNeeded), - shownOnce(false), sizeAdjustPolicy(QAbstractScrollArea::AdjustIgnored), + shownOnce(false), inResize(false), sizeAdjustPolicy(QAbstractScrollArea::AdjustIgnored), viewport(0), cornerWidget(0), left(0), top(0), right(0), bottom(0), xoffset(0), yoffset(0), viewportFilter(0) #ifdef Q_WS_WIN @@ -995,8 +995,12 @@ bool QAbstractScrollArea::event(QEvent *e) d->viewport->setMouseTracking(hasMouseTracking()); break; case QEvent::Resize: + if (!d->inResize) { + d->inResize = true; d->layoutChildren(); - break; + d->inResize = false; + } + break; case QEvent::Show: if (!d->shownOnce && d->sizeAdjustPolicy == QAbstractScrollArea::AdjustToContentsOnFirstShow) { d->sizeHint = QSize(); diff --git a/src/widgets/widgets/qabstractscrollarea_p.h b/src/widgets/widgets/qabstractscrollarea_p.h index 3093c2f812..2a4b20fe81 100644 --- a/src/widgets/widgets/qabstractscrollarea_p.h +++ b/src/widgets/widgets/qabstractscrollarea_p.h @@ -76,6 +76,7 @@ public: Qt::ScrollBarPolicy vbarpolicy, hbarpolicy; bool shownOnce; + bool inResize; mutable QSize sizeHint; QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy; -- cgit v1.2.3