我有QWidget一个对话框.在程序运行过程中,几个QCheckBox *对象被添加到布局中,如下所示:
QCheckBox *c = new QCheckBox("Checkbox text");
ui->myWidget->layout()->addWidget(c);
Run Code Online (Sandbox Code Playgroud)
这适用于所有复选框.但是,QPushButton我的对话框中也有一个名为"clear"的按钮,当它被按下时应该清除myWidget中的所有内容,使其保持空白状态,就像之前QCheckboxes添加任何内容一样.我一直在网上和文档中寻找,但我找不到这样做的方法.我发现这个问题与我的问题类似,并尝试了这样的解决方案:
void myClass::on_clear_clicked()
{
while(ui->myWidget->layout()->count() > 0)
{
QLayoutItem *item = ui->myWidget->layout()->takeAt(0);
delete item;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎没有做任何事情.值得注意的是,我不确定这是否正确地从他的答案中翻译出来; 有点不清楚应该如何实现所给出的功能,所以我做了最好的教育猜测.如果有人知道我可以在上面改变它以使它工作(或者只是一种不同的工作方式),那将非常感激.
Nej*_*jat 11
你可以试试这个:
while ( QLayoutItem* item = ui->myWidget->layout()->takeAt( 0 ) )
{
Q_ASSERT( ! item->layout() ); // otherwise the layout will leak
delete item->widget();
delete item;
}
Run Code Online (Sandbox Code Playgroud)
关于布局的精彩之处在于它们会自动处理窗口小部件的删除.所以你真正需要的是迭代小部件,你就完成了.由于您想要消除给定小部件的所有子节点,只需执行以下操作:
for (auto widget: ui->myWidget::findChildren<QWidget*>
({}, Qt::FindDirectChildrenOnly))
delete widget;
Run Code Online (Sandbox Code Playgroud)
根本不需要担心布局.这适用于孩子是否由布局管理.
如果你想要真正正确,你需要忽略作为子窗口小部件但是独立窗口的窗口小部件.如果这是在通用库代码中就是这种情况:
for (auto widget: ui->myWidget::findChildren<QWidget*>
({}, Qt::FindDirectChildrenOnly))
if (! widget->windowFlags() & Qt::Window) delete widget;
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想删除由给定布局及其子布局管理的子项:
void clearWidgets(QLayout * layout) {
if (! layout)
return;
while (auto item = layout->takeAt(0)) {
delete item->widget();
clearWidgets(item->layout());
}
}
Run Code Online (Sandbox Code Playgroud)