Qt - 从 QWidget 的布局中清除所有小部件

新手上路,请多包涵

我在对话框中有一个 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;
  }
}

然而,这似乎并没有做任何事情。值得注意的是,我不确定这是否正确地从他的回答中翻译出来;应该如何实现给定的功能有点不清楚,所以我做了我最有根据的猜测。如果有人知道我可以在上面进行哪些更改以使其工作(或只是一种不同的工作方式),将不胜感激。

原文由 thnkwthprtls 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

布局的美妙之处在于它们会自动处理小部件的删除。所以你真正需要的只是迭代小部件,你就完成了。由于您想清除给定小部件的所有子级,只需执行以下操作:

 for (auto widget: ui->myWidget::findChildren<QWidget*>
                                            ({}, Qt::FindDirectChildrenOnly))
  delete widget;

完全不需要担心布局。无论孩子是否由布局管理,这都有效。

如果您想真正正确,则需要忽略作为子小部件但是独立窗口的小部件。如果这是在通用库代码中,就会出现这种情况:

 for (auto widget: ui->myWidget::findChildren<QWidget*>
                                            ({}, Qt::FindDirectChildrenOnly))
  if (! widget->windowFlags() & Qt::Window) delete widget;

或者,如果您只想删除由给定布局及其子布局管理的子级:

 void clearWidgets(QLayout * layout) {
   if (! layout)
      return;
   while (auto item = layout->takeAt(0)) {
      delete item->widget();
      clearWidgets(item->layout());
   }
}

原文由 Kuba hasn’t forgotten Monica 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以试试这个:

     while ( QLayoutItem* item = ui->myWidget->layout()->takeAt( 0 ) )
    {
        Q_ASSERT( ! item->layout() ); // otherwise the layout will leak
        delete item->widget();
        delete item;
    }

原文由 Nejat 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题