Do not remove non-widget items when removeWidget() called with nullptr

child->widget() returns null if the layout item is not a widget.
Thus, calling removeWidget(nullptr) will remove all non-widget items
such as layouts or strechers.

Change-Id: I772c1158d0f7e8e2850b6e571b0405a2896f09b8
Pick-to: 6.0 6.1 5.15
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: David Faure <david.faure@kdab.com>
This commit is contained in:
Piotr Srebrny 2021-04-28 14:37:44 +02:00
parent 1e85dfacf3
commit 867c0b8d8a
2 changed files with 29 additions and 0 deletions

View File

@ -1355,6 +1355,11 @@ QRect QLayout::alignmentRect(const QRect &r) const
*/
void QLayout::removeWidget(QWidget *widget)
{
if (Q_UNLIKELY(!widget)) {
qWarning("QLayout::removeWidget: Cannot remove a null widget.");
return;
}
int i = 0;
QLayoutItem *child;
while ((child = itemAt(i))) {

View File

@ -70,6 +70,7 @@ private slots:
void controlTypes2();
void adjustSizeShouldMakeSureLayoutIsActivated();
void testRetainSizeWhenHidden();
void removeWidget();
};
tst_QLayout::tst_QLayout()
@ -398,5 +399,28 @@ void tst_QLayout::testRetainSizeWhenHidden()
QCOMPARE(widget.sizeHint().height(), normalHeight);
}
void tst_QLayout::removeWidget()
{
QHBoxLayout layout;
QCOMPARE(layout.count(), 0);
QWidget w;
layout.addWidget(&w);
QCOMPARE(layout.count(), 1);
layout.removeWidget(&w);
QCOMPARE(layout.count(), 0);
QPointer<QLayout> childLayout(new QHBoxLayout);
layout.addLayout(childLayout);
QCOMPARE(layout.count(), 1);
layout.removeWidget(nullptr);
QCOMPARE(layout.count(), 1);
layout.removeItem(childLayout);
QCOMPARE(layout.count(), 0);
QVERIFY(!childLayout.isNull());
}
QTEST_MAIN(tst_QLayout)
#include "tst_qlayout.moc"