从 QLayout 中删除 QWidgets?

Posted

技术标签:

【中文标题】从 QLayout 中删除 QWidgets?【英文标题】:Remove QWidgets from QLayout? 【发布时间】:2015-09-01 14:12:37 【问题描述】:

我用我在运行时创建的QWidget 对象动态填充我的QVBoxLayout。我也想在运行时删除它们,但是如何删除呢?

我可以一个一个移除小部件:

void QLayout::removeWidget(QWidget * widget)

我可以以某种方式遍历布局吗?

【问题讨论】:

我不明白你的问题是什么。 removeWidget 有什么问题? @Jérôme 我将多个 QWidget 放入该布局中,但我不记得它们。我想全部删除。 【参考方案1】:

条条大路通罗马 ;)

Qt documentation of QLayout::takeAt 声明:

以下代码片段显示了一种从 布局:

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) 
    ...
    delete child;

要同时删除托管小部件,您只需添加一行:

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) 
    ...
    delete child->widget();
    delete child;

【讨论】:

【参考方案2】:

有一个 count 方法返回存储的小部件的数量,还有一个 itemAt() 方法,给定一个索引,它返回指向相关存储小部件的指针。您可以检索所有指针,然后将其删除。您应该首先检索所有指针,因为如果您在计数时删除一个,那么存储的小部件的数量会在迭代期间发生变化。

itemAt() 使用widget 检索小部件本身的方法检索QLayoutItem

while (layout->count() != 0) 
  QLayoutItem *item = layout->itemAt(0);
  layout->removeWidget(item->widget());

【讨论】:

以上是关于从 QLayout 中删除 QWidgets?的主要内容,如果未能解决你的问题,请参考以下文章

如何完全删除 QLayout 的边距(特定于 Mac OS)

如何在颤动中从图形 QL 响应中删除类型名

在 QLayout 中创建和删除自定义 QWidget 时出现 RAM 问题

QT删除QWidget或QLayout下的控件

如何在 PySide2 中添加边框或设置透明 QLayout?

Qt:RemoveWidget 和对象删除