我有一个包含内容的布局列表。它形成一个自定义表。
要清理表格,我会遍历所有布局并逐个取出项目。然后删除布局。
// Delete all items
QHBoxLayout* row = NULL;
while( !rowLyts_.isEmpty() && (row = rowLyts_.takeAt(0)) != 0 )
{
QLayoutItem *item;
while ((item = row->takeAt(0)) != 0)
delete item;
delete row;
}
这似乎有效。但是当我再次开始填充表格时,我会看到清洁之前那些物品的“幽灵”。大多数时候,他们都在新的对象后面。他们仍在工作。
当您仅使用带有小部件的布局时,也会发生这种情况。
我只是想清除整个布局布局而不删除内容小部件。清理布局的安全方法!。
答案 0 :(得分:5)
您正在删除布局项目,但不删除项目用于管理的小部件。您必须删除小部件。删除布局本身时,将自动删除所有非布局项目。
QHBoxLayout* row;
while(!rowLyts_.isEmpty() && (row = rowLyts_.takeAt(0)))
{
QLayoutItem *item;
while ((item = row->takeAt(0))) {
// The item will be deleted when the layout itself is
// destructed. Items such as spacers will return a null
// widget, its deletion is a safe no-op.
delete item->widget();
// We don't handle recursion into sublayouts.
// We check for it so that we won't leak the layout.
Q_ASSERT(!item->layout());
}
delete row;
}
断言是为了确保代码所使用的布局与隐含的precondition匹配:必须没有子布局,因为写入的代码不会进入它们。任何子布局及其小部件都会泄漏(不是内存泄漏,而是资源泄漏)。如果违反前提条件,断言将中止执行。
答案 1 :(得分:2)
清除布局可以通过以下方式完成:
QLayoutItem* item;
while ( ( item = row->takeAt( 0 ) ) != NULL )
{
delete item->widget();
delete item;
}