From 716d33d2a73ade42eb31be3e8ecbaeecdd5ddd21 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sun, 21 Oct 2012 20:10:22 +0200 Subject: [QTBUG-27420] Make Q{Box,Grid,Form}Layout::takeAt() unparent a nested layout QStackedLayout doesn't have support for QLayout, only QWidget, so the issue doesn't arise there. Reported-by: Johannes Schaub Task-number: QTBUG-27420 Change-Id: I71f8d10a036918c16d8f8c9197a2ec61cd76cf01 Reviewed-by: Friedemann Kleint --- src/widgets/kernel/qboxlayout.cpp | 6 ++++++ src/widgets/kernel/qformlayout.cpp | 7 +++++++ src/widgets/kernel/qgridlayout.cpp | 15 ++++++++++----- 3 files changed, 23 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/widgets/kernel/qboxlayout.cpp b/src/widgets/kernel/qboxlayout.cpp index d16c999508..62c4e526c7 100644 --- a/src/widgets/kernel/qboxlayout.cpp +++ b/src/widgets/kernel/qboxlayout.cpp @@ -729,6 +729,12 @@ QLayoutItem *QBoxLayout::takeAt(int index) b->item = 0; delete b; + if (QLayout *l = item->layout()) { + // sanity check in case the user passed something weird to QObject::setParent() + if (l->parent() == this) + l->setParent(0); + } + invalidate(); return item; } diff --git a/src/widgets/kernel/qformlayout.cpp b/src/widgets/kernel/qformlayout.cpp index b726ff83f8..f875de16df 100644 --- a/src/widgets/kernel/qformlayout.cpp +++ b/src/widgets/kernel/qformlayout.cpp @@ -1409,6 +1409,13 @@ QLayoutItem *QFormLayout::takeAt(int index) QLayoutItem *i = item->item; item->item = 0; delete item; + + if (QLayout *l = i->layout()) { + // sanity check in case the user passed something weird to QObject::setParent() + if (l->parent() == this) + l->setParent(0); + } + return i; } diff --git a/src/widgets/kernel/qgridlayout.cpp b/src/widgets/kernel/qgridlayout.cpp index b5cd746c03..eda9b9def6 100644 --- a/src/widgets/kernel/qgridlayout.cpp +++ b/src/widgets/kernel/qgridlayout.cpp @@ -156,15 +156,20 @@ public: return 0; } inline QLayoutItem *takeAt(int index) { - QLayoutItem *item = 0; + Q_Q(QGridLayout); if (index < things.count()) { - QGridBox *b = things.takeAt(index); - if (b) { - item = b->takeItem(); + if (QGridBox *b = things.takeAt(index)) { + QLayoutItem *item = b->takeItem(); + if (QLayout *l = item->layout()) { + // sanity check in case the user passed something weird to QObject::setParent() + if (l->parent() == q) + l->setParent(0); + } delete b; + return item; } } - return item; + return 0; } void getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) const { -- cgit v1.2.3