summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/kernel/qboxlayout.cpp3
-rw-r--r--src/widgets/kernel/qformlayout.cpp4
-rw-r--r--src/widgets/kernel/qgridlayout.cpp6
-rw-r--r--src/widgets/kernel/qlayout.cpp10
-rw-r--r--src/widgets/kernel/qlayout.h1
-rw-r--r--tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp21
6 files changed, 40 insertions, 5 deletions
diff --git a/src/widgets/kernel/qboxlayout.cpp b/src/widgets/kernel/qboxlayout.cpp
index e1a7903628..d0e7a16999 100644
--- a/src/widgets/kernel/qboxlayout.cpp
+++ b/src/widgets/kernel/qboxlayout.cpp
@@ -942,7 +942,8 @@ void QBoxLayout::insertSpacerItem(int index, QSpacerItem *spacerItem)
void QBoxLayout::insertLayout(int index, QLayout *layout, int stretch)
{
Q_D(QBoxLayout);
- addChildLayout(layout);
+ if (!adoptLayout(layout))
+ return;
if (index < 0) // append
index = d->list.count();
QBoxLayoutItem *it = new QBoxLayoutItem(layout, stretch);
diff --git a/src/widgets/kernel/qformlayout.cpp b/src/widgets/kernel/qformlayout.cpp
index e2d25de537..669faac4f6 100644
--- a/src/widgets/kernel/qformlayout.cpp
+++ b/src/widgets/kernel/qformlayout.cpp
@@ -976,8 +976,8 @@ void QFormLayoutPrivate::setLayout(int row, QFormLayout::ItemRole role, QLayout
{
if (layout) {
Q_Q(QFormLayout);
- q->addChildLayout(layout);
- setItem(row, role, layout);
+ if (q->adoptLayout(layout))
+ setItem(row, role, layout);
}
}
diff --git a/src/widgets/kernel/qgridlayout.cpp b/src/widgets/kernel/qgridlayout.cpp
index 12049f3303..96820e3891 100644
--- a/src/widgets/kernel/qgridlayout.cpp
+++ b/src/widgets/kernel/qgridlayout.cpp
@@ -1505,7 +1505,8 @@ void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn,
void QGridLayout::addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment)
{
Q_D(QGridLayout);
- addChildLayout(layout);
+ if (!adoptLayout(layout))
+ return;
QGridBox *b = new QGridBox(layout);
b->setAlignment(alignment);
d->add(b, row, column);
@@ -1524,7 +1525,8 @@ void QGridLayout::addLayout(QLayout *layout, int row, int column,
int rowSpan, int columnSpan, Qt::Alignment alignment)
{
Q_D(QGridLayout);
- addChildLayout(layout);
+ if (!adoptLayout(layout))
+ return;
QGridBox *b = new QGridBox(layout);
b->setAlignment(alignment);
d->add(b, row, (rowSpan < 0) ? -1 : row + rowSpan - 1, column, (columnSpan < 0) ? -1 : column + columnSpan - 1);
diff --git a/src/widgets/kernel/qlayout.cpp b/src/widgets/kernel/qlayout.cpp
index d59a9db75d..0402f9939a 100644
--- a/src/widgets/kernel/qlayout.cpp
+++ b/src/widgets/kernel/qlayout.cpp
@@ -806,6 +806,16 @@ void QLayout::addChildLayout(QLayout *l)
}
+/*!
+ \internal
+ */
+bool QLayout::adoptLayout(QLayout *layout)
+{
+ const bool ok = !layout->parent();
+ addChildLayout(layout);
+ return ok;
+}
+
#ifdef QT_DEBUG
static bool layoutDebug()
{
diff --git a/src/widgets/kernel/qlayout.h b/src/widgets/kernel/qlayout.h
index c293939bd3..6f43c2b28a 100644
--- a/src/widgets/kernel/qlayout.h
+++ b/src/widgets/kernel/qlayout.h
@@ -148,6 +148,7 @@ protected:
void childEvent(QChildEvent *e);
void addChildLayout(QLayout *l);
void addChildWidget(QWidget *w);
+ bool adoptLayout(QLayout *layout);
QRect alignmentRect(const QRect&) const;
protected:
diff --git a/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp b/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp
index 227a31b10d..84d796f657 100644
--- a/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp
+++ b/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp
@@ -68,6 +68,7 @@ public slots:
private slots:
void insertSpacerItem();
+ void insertLayout();
void sizeHint();
void sizeConstraints();
void setGeometry();
@@ -166,6 +167,26 @@ void tst_QBoxLayout::insertSpacerItem()
window->show();
}
+void tst_QBoxLayout::insertLayout()
+{
+ QWidget *window = new QWidget;
+ QVBoxLayout *vbox = new QVBoxLayout(window);
+ QVBoxLayout *dummyParentLayout = new QVBoxLayout;
+ QHBoxLayout *subLayout = new QHBoxLayout;
+ dummyParentLayout->addLayout(subLayout);
+ QCOMPARE(subLayout->parent(), dummyParentLayout);
+ QCOMPARE(dummyParentLayout->count(), 1);
+
+ // add subLayout to another layout
+ QTest::ignoreMessage(QtWarningMsg, "QLayout::addChildLayout: layout \"\" already has a parent");
+ vbox->addLayout(subLayout);
+ QCOMPARE((subLayout->parent() == vbox), (vbox->count() == 1));
+
+ delete dummyParentLayout;
+ delete window;
+}
+
+
void tst_QBoxLayout::sizeHint()
{
QWidget *window = new QWidget;