ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – Qt – 清除QWidget布局中的所有小部件

2019-10-07 21:05:56  阅读:1551  来源: 互联网

标签:qwidget c qt


我在对话框中有一个QWidget.在程序运行过程中,几个QCheckBox *对象被添加到布局中,如下所示:

QCheckBox *c = new QCheckBox("Checkbox text");
ui->myWidget->layout()->addWidget(c);

这适用于所有复选框.但是,我的对话框中还有一个名为“clear”的QPushButton,当它被按下时应该清除myWidget中的所有内容,使其空白,就像添加任何QCheckbox之前一样.我一直在网上和文档中寻找,但我很难找到一种方法来做到这一点.我发现this问题,我认为这个问题与我的问题类似,并尝试了这样的解决方案:

void myClass::on_clear_clicked()
{
  while(ui->myWidget->layout()->count() > 0)
  {
    QLayoutItem *item = ui->myWidget->layout()->takeAt(0);
    delete item;
  }
}

然而,这似乎没有做任何事情.值得注意的是,我不确定这是否正确地从他的答案中翻译出来;有点不清楚应该如何实现所给出的功能,所以我做了最好的教育猜测.如果有人知道我可以在上面改变它以使它工作(或者只是一种不同的工作方式),那将非常感激.

解决方法:

布局的精彩之处在于它们可以自动处理窗口小部件的删除.所以你真正需要的是迭代小部件,你就完成了.由于您要清除给定窗口小部件的所有子项,只需执行以下操作:

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());
   }
}

标签:qwidget,c,qt
来源: https://codeday.me/bug/20191007/1868935.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有