diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2021-01-11 14:44:14 +0100 |
---|---|---|
committer | Ivan Solovev <ivan.solovev@qt.io> | 2021-01-15 09:35:44 +0100 |
commit | 4f8041b01445fd4eec0beb133719645d00d0b2ac (patch) | |
tree | 69fc40ad29629403280eaf7bf74ff2023804dccb /src/imports/layouts | |
parent | 6bccba43c932c8d1370bc03f17ea3082aa6d3ca8 (diff) |
QuickLayouts: fix crash when layout width depends on parent width
Some tricky cases of setting layout width based on parent layout width
were leading to infinite recursive loop of layout size calculation
(see the attached example in the related Jira task).
Initially the QQuickGridLayoutBase::rearrange() method already had
a recurse check, but it seemed to happen too late, so that the
recursive calls kept happening from the ensureLayoutItemsUpdated()
calls.
This commit moves the recursion check up, so that it's actually
executed before we have a chance to get to the next level of recursion.
Pick-to: 5.15 6.0
Fixes: QTBUG-87253
Change-Id: I473ee219e7b5b13547e33ebbd3a6d884de2c7d45
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'src/imports/layouts')
-rw-r--r-- | src/imports/layouts/qquicklinearlayout.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/imports/layouts/qquicklinearlayout.cpp b/src/imports/layouts/qquicklinearlayout.cpp index 7626506c75..760700beaf 100644 --- a/src/imports/layouts/qquicklinearlayout.cpp +++ b/src/imports/layouts/qquicklinearlayout.cpp @@ -470,8 +470,6 @@ void QQuickGridLayoutBase::rearrange(const QSizeF &size) if (!isReady()) return; - ensureLayoutItemsUpdated(); - qCDebug(lcQuickLayouts) << "QQuickGridLayoutBase::rearrange" << d->m_recurRearrangeCounter << this; const auto refCounter = qScopeGuard([&d] { --(d->m_recurRearrangeCounter); @@ -483,6 +481,8 @@ void QQuickGridLayoutBase::rearrange(const QSizeF &size) return; } + ensureLayoutItemsUpdated(); + d->m_rearranging = true; qCDebug(lcQuickLayouts) << objectName() << "QQuickGridLayoutBase::rearrange()" << size; Qt::LayoutDirection visualDir = effectiveLayoutDirection(); |