fix(ui): 修复 DynamicFormView::clear() 对嵌套布局重复释放导致的崩溃

it==it->layout()(QLayout 即 QLayoutItem),原代码 delete sub 后又 delete it 双重释放。
触发:clear 一个已填充表单时(切项目/重选对象→showMessage/setForm)崩溃。
This commit is contained in:
gaozheng 2026-06-10 21:31:00 +08:00
parent 3daaad3de3
commit 72abeaa1d8
1 changed files with 4 additions and 4 deletions

View File

@ -111,15 +111,15 @@ void DynamicFormView::clear()
while (cardLayout_->count() > 0) { while (cardLayout_->count() > 0) {
QLayoutItem* it = cardLayout_->takeAt(0); QLayoutItem* it = cardLayout_->takeAt(0);
if (it->widget()) it->widget()->deleteLater(); if (it->widget()) it->widget()->deleteLater();
if (it->layout()) { if (QLayout* sub = it->layout()) {
// 嵌套网格:先回收其子控件,再删布局,避免残留控件泄漏/重叠。 // 嵌套网格:先回收其子控件(控件归属 card_删布局不会连带删再让下方
QLayout* sub = it->layout(); // delete it 释放该嵌套布局本身——注意 it == it->layout()QLayout 即 QLayoutItem
// 故此处不可再 delete sub否则与 delete it 重复释放导致崩溃。
while (sub->count() > 0) { while (sub->count() > 0) {
QLayoutItem* sit = sub->takeAt(0); QLayoutItem* sit = sub->takeAt(0);
if (sit->widget()) sit->widget()->deleteLater(); if (sit->widget()) sit->widget()->deleteLater();
delete sit; delete sit;
} }
delete sub;
} }
delete it; delete it;
} }