【发布时间】:2018-11-12 11:23:36
【问题描述】:
我的窗口上有很多小部件,我需要删除除 QMenuBar 之外的所有小部件。
ui->menuBar->addAction("Action!");
QWidget *widget = new QWidget(this);
widget->setObjectName("widget");
QVBoxLayout *layout = new QVBoxLayout(widget);
layout->addWidget(new QPushButton());
layout->addWidget(new QTableWidget(3, 4));`
//now i want to delete all i created
QList<QWidget*> list = findChildren<QWidget*>();
for (int i = 0; i < list.size(); ++i)
qDeleteAll(list[i]);
但这不是workink...
【问题讨论】:
-
请清除下一行:widget->setObjectName("widget");
-
我相信,你只需要删除一个指针,在你的例子中就是
widget。其余的小部件将被自动删除,因为它们是您的“主”小部件的子级。 -
@vahancho 是的,你是对的。但是,OP 在清除其子级后可能仍想使用
widget。 -
while (!list.isEmpty()) list.takeFirst()->deleteLater(); -
即使你正确使用了
qDeleteAll(),代码也可能会崩溃。因为列表中填充了findChildren(),这是递归的。如果您尝试删除已删除父项的子项(这意味着子项已与父项一起删除),则从列表中顺序删除项目可能会崩溃。双重删除将失败并可能崩溃。