From 72abeaa1d8daf11b272ba46f13c3ef4c2ccba6b9 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Wed, 10 Jun 2026 21:31:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E4=BF=AE=E5=A4=8D=20DynamicFormView?= =?UTF-8?q?::clear()=20=E5=AF=B9=E5=B5=8C=E5=A5=97=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E9=87=8A=E6=94=BE=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it==it->layout()(QLayout 即 QLayoutItem),原代码 delete sub 后又 delete it 双重释放。 触发:clear 一个已填充表单时(切项目/重选对象→showMessage/setForm)崩溃。 --- src/app/panels/DynamicFormView.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/panels/DynamicFormView.cpp b/src/app/panels/DynamicFormView.cpp index b2dd154..a4e6c5a 100644 --- a/src/app/panels/DynamicFormView.cpp +++ b/src/app/panels/DynamicFormView.cpp @@ -111,15 +111,15 @@ void DynamicFormView::clear() while (cardLayout_->count() > 0) { QLayoutItem* it = cardLayout_->takeAt(0); if (it->widget()) it->widget()->deleteLater(); - if (it->layout()) { - // 嵌套网格:先回收其子控件,再删布局,避免残留控件泄漏/重叠。 - QLayout* sub = it->layout(); + if (QLayout* sub = it->layout()) { + // 嵌套网格:先回收其子控件(控件归属 card_,删布局不会连带删),再让下方 + // delete it 释放该嵌套布局本身——注意 it == it->layout()(QLayout 即 QLayoutItem), + // 故此处不可再 delete sub,否则与 delete it 重复释放导致崩溃。 while (sub->count() > 0) { QLayoutItem* sit = sub->takeAt(0); if (sit->widget()) sit->widget()->deleteLater(); delete sit; } - delete sub; } delete it; }