summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Spoerl <[email protected]>2024-04-09 19:23:33 +0200
committerAxel Spoerl <[email protected]>2024-04-10 19:01:06 +0000
commitef8e548cf1adf8032c030df04e69988f238c77fb (patch)
treed094a367af78bb17ca3e259e233c42770ff241d2
parentca851b33171e652b740efbc47d41b8cf906ecd3d (diff)
QLayout: Consume ChildRemoved event, when layout is disabled
QLayout::widgetEvent() returned early, when the layout was disabled. That suppressed ChildRemoved events and lead to a crash, when the layout was enabled again. Don't return early on ChildRemoved events. Add an autotest in tst_layout::removeWidget(). Fixes: QTBUG-124151 Pick-to: 6.7 6.5 6.2 Change-Id: Ib0a0bb73978d9fc2c9777d300cf38a8c4496b702 Reviewed-by: Volker Hilsheimer <[email protected]> Reviewed-by: Chris RenĂ© Lerner <[email protected]>
-rw-r--r--src/widgets/kernel/qlayout.cpp5
-rw-r--r--tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp12
2 files changed, 12 insertions, 5 deletions
diff --git a/src/widgets/kernel/qlayout.cpp b/src/widgets/kernel/qlayout.cpp
index 0251ecd7fdc..a826ea75bc6 100644
--- a/src/widgets/kernel/qlayout.cpp
+++ b/src/widgets/kernel/qlayout.cpp
@@ -520,10 +520,11 @@ void QLayoutPrivate::doResize()
void QLayout::widgetEvent(QEvent *e)
{
Q_D(QLayout);
- if (!d->enabled)
+ const QEvent::Type type = e->type();
+ if (!d->enabled && type != QEvent::ChildRemoved)
return;
- switch (e->type()) {
+ switch (type) {
case QEvent::Resize:
if (d->activated)
d->doResize();
diff --git a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp
index 3c3010c3ec3..bd170ca8ab9 100644
--- a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp
+++ b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp
@@ -378,10 +378,10 @@ void tst_QLayout::removeWidget()
{
QHBoxLayout layout;
QCOMPARE(layout.count(), 0);
- QWidget w;
- layout.addWidget(&w);
+ std::unique_ptr<QWidget> w(new QWidget);
+ layout.addWidget(w.get());
QCOMPARE(layout.count(), 1);
- layout.removeWidget(&w);
+ layout.removeWidget(w.get());
QCOMPARE(layout.count(), 0);
QPointer<QLayout> childLayout(new QHBoxLayout);
@@ -395,6 +395,12 @@ void tst_QLayout::removeWidget()
QCOMPARE(layout.count(), 0);
QVERIFY(!childLayout.isNull());
+
+ // Test inactive layout consumes ChildRemoved event (QTBUG-124151)
+ layout.addWidget(w.get());
+ layout.setEnabled(false);
+ w.reset();
+ layout.setEnabled(true);
}
QTEST_MAIN(tst_QLayout)