我在一个对话框中有一个 QWidget
。在程序运行的过程中,会像这样添加几个 QCheckBox *
对象到布局中:
QCheckBox *c = new QCheckBox("Checkbox text");
ui->myWidget->layout()->addWidget(c);
这对于所有复选框都很好用。但是,我在我的对话框中还有一个名为“清除”的
QPushButton
,当它被按下时,应该清空myWidget中的所有内容,使其变为空白,就像在添加任何QCheckBoxes
之前一样。我在网上和文档中寻找了一些方法,但我很难找到一种方法来做到这一点。我发现这个问题与我的问题类似,并尝试使用他们的解决方案,如下所示:void myClass::on_clear_clicked()
{
while(ui->myWidget->layout()->count() > 0)
{
QLayoutItem *item = ui->myWidget->layout()->takeAt(0);
delete item;
}
}
然而,这似乎没有起作用。 值得注意的是,我不确定是否正确翻译了他的答案; 给定的函数应该如何实现有点不清楚,所以我尽力做出了最好的猜测。 如果有人知道我可以更改以上内容以使其工作(或仅通过其他方法使其工作),那将不胜感激。
item->widget()
是否有效,并且最好调用对象的deleteLater
而不是直接删除它。只需使用if (auto widget = item->widget()) widget->deleteLater();
来修补该行即可。 - iKlsRdelete
有定义的行为——它什么也不做。随时删除小部件都没问题,除非此代码位于从小部件调用的槽内,并且它使用了小部件上下文(���this
)。 - Kuba hasn't forgotten MonicaQ_ASSERT(sender() != item->widget() || ! sender())
,此代码将变得稍微更有弹性,这将避免由于删除发送器部件而导致难以调试的问题。在这种情况下,硬性失败要容易得多。这不会对发布版本产生任何性能影响。 - Kuba hasn't forgotten Monica