行。我让它工作了。让我解释一下这个删除,保留小部件是如何工作的。
小部件由其父布局知道。然后您通过布局将其删除。通过做:
layout()->removeAt(widget);
delete widget;
如果您在 QLayout(或其子级)中使用 takeAt(index),它会为您提供一个 QLayoutItem。要访问内部的小部件,只需使用 widget()。但是没有办法在不删除它的情况下删除它。所以这种方法是无效的。
在文档中,它讲述了一种删除元素的方法:
QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
...
delete child;
}
在 Qt 中需要特别注意的是:如果你有一个layouts 的层次结构树,在 layouts中添加了 addLayout(),无论你的 widget 插入多深,你都可以将它从子布局或任何父布局中移除布局,如果布局中的树路径和此项目是从子布局构建的。
最简单的事情是在自定义表中保留指向所有项目的指针列表。清除表以重建它时,只需在您的小部件中执行此操作:
CustomTableItem* item;
while ( !items_.isEmpty() && ( (item = items_.takeFirst()) != 0 ) ){
layout()->removeWidget(item);
delete item; // It works no matter where the item is
}
items_.clear(); // clear the list afterwards.
它工作得很好,它自己也更新了布局。如果要保留元素,只需跳过“删除项目”;并在之后使用它们。
需要注意的重要一点是,不同的“删除”功能在 QList 或类似小部件和 QLayout 中的工作方式不同(正如我在 Qt Docs 上所理解的那样)。
在 QList 中,removeAt 实际上移除了对象。
(Qt 4.7 QList Docs)“删除索引位置 i 处的项目。i 必须是列表中的有效索引位置(即 0 <= i < size())。”
在 QLayout 中,removeWidget 或 removeItem 不会删除项目/小部件,您有责任删除它,就像我之前所做的那样。
(Qt 4.7 QLayout Docs)“从布局中删除小部件小部件。在此调用之后,调用者有责任为小部件提供合理的几何形状或将小部件放回布局中。”
希望能帮助到你。如果您发现任何错误,您可以告诉我,我将编辑答案!
更多关于删除的信息:
其他 stackoverflow 帖子