好的,我搞定了。让我解释一下这个“移除、保留小部件”的工作原理。
一个小部件是通过其父布局来确定的。你可以通过布局来移除它。具体操作如下:
layout()->removeAt(widget);
delete widget;
如果您在QLayout(或其子类)中使用takeAt(index),它将给您一个QLayoutItem。要访问其中的小部件,请使用widget()。但是没有办法在不删除小部件的情况下删除它。因此,这种方法是无效的。
文档中介绍了一种删除元素的方法:
QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
...
delete child;
}
在Qt中需要特别注意以下事项:
如果您有一棵布局层次树,其中包含使用addLayout()在布局内添加的子布局,则无论您的窗口小部件插入到多深的位置,只要该树路径是由子布局构建而成的,就可以从子布局或任何父布局中删除它。
最简单的方法是在自定义表中保留所有项目的指针列表。当清除表以重构时,只需在窗口小部件内执行以下操作:
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.
它完美地工作,并且能够自动更新布局。
如果你想保留元素,只需跳过“delete item;”,然后在之后使用它们。
需要注意的重要事项是,在QList或类似小部件中,不同的“remove”函数具有不同的作用(就我所知,在Qt文档中),以及在QLayout中。
在 QList 中,removeAt 实际上会删除对象。
(Qt 4.7 QList 文档) "删除索引位置 i 处的项目。i 必须是列表中的有效索引位置(即 0 <= i < size())。"
在 QLayout 中,removeWidget 或 removeItem 不会删除该项/小部件,您需要负责将其删除,就像我之前所做的那样。
(Qt 4.7 QLayout 文档) "从布局中删除 widget 小部件。调用此函数后,调用者有责任赋予小部件合理的几何属性,或将其放回布局中。"
希望这有所帮助。如果您发现任何错误,可以告诉我,我会编辑答案!
更多关于删除内容的信息:
其他 stackoverflow 帖子
QLayoutItem * item = layout->itemAt(0); QWidget * widget = item->widget(); if (widget != NULL) { layout->removeWidget(widget); //如果您想删除小部件,请执行: widget->setParent(NULL); delete widget; }
(格式可能无法正常显示,但您已经了解了意思...) - Bim