From 8f27ca23465d5595d5a0e4653962652ceded334a Mon Sep 17 00:00:00 2001 From: Axel Spoerl Date: Tue, 9 Apr 2024 19:23:33 +0200 Subject: [PATCH] QLayout: Consume ChildRemoved event, when layout is disabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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.5 6.2 Change-Id: Ib0a0bb73978d9fc2c9777d300cf38a8c4496b702 Reviewed-by: Volker Hilsheimer Reviewed-by: Chris René Lerner (cherry picked from commit ef8e548cf1adf8032c030df04e69988f238c77fb) Reviewed-by: Qt Cherry-pick Bot --- src/widgets/kernel/qlayout.cpp | 5 +++-- tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp | 12 +++++++++--- 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 w(new QWidget); + layout.addWidget(w.get()); QCOMPARE(layout.count(), 1); - layout.removeWidget(&w); + layout.removeWidget(w.get()); QCOMPARE(layout.count(), 0); QPointer 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)