diff --git a/src/quicklayouts/qquicklayout.cpp b/src/quicklayouts/qquicklayout.cpp index 28a99ced9e..df25fb7ac1 100644 --- a/src/quicklayouts/qquicklayout.cpp +++ b/src/quicklayouts/qquicklayout.cpp @@ -787,6 +787,7 @@ QQuickLayoutAttached *QQuickLayout::qmlAttachedProperties(QObject *object) void QQuickLayout::updatePolish() { qCDebug(lcQuickLayouts) << "updatePolish() ENTERING" << this; + d_func()->m_disableRearrange = false; m_inUpdatePolish = true; // Might have become "undirty" before we reach this updatePolish() @@ -915,8 +916,13 @@ void QQuickLayout::itemChange(ItemChange change, const ItemChangeData &value) maybeSubscribeToBaseLineOffsetChanges(item); QQuickItemPrivate::get(item)->removeItemChangeListener(this, changeTypes); qCDebug(lcQuickLayouts) << "ChildRemoved" << item; - if (isReady()) + if (isReady()) { invalidate(); + // The invalidate() triggers polish and this relayout items in the + // layout engine. But if there is any geometry change from the same + // item (due to deferred deletion), its better to skip rearrange + d_func()->m_disableRearrange = true; + } } QQuickItem::itemChange(change, value); } @@ -925,7 +931,7 @@ void QQuickLayout::geometryChange(const QRectF &newGeometry, const QRectF &oldGe { Q_D(QQuickLayout); QQuickItem::geometryChange(newGeometry, oldGeometry); - if (invalidated() || d->m_disableRearrange || !isReady()) + if (d->m_disableRearrange || !isReady()) return; qCDebug(lcQuickLayouts) << "QQuickLayout::geometryChange" << newGeometry << oldGeometry;