清理Qt布局和添加其他小部件不起作用.幽灵小部件留下来.Qt bug?

dar*_*aze 2 c++ layout qt qt4.7

我有一个包含项目的布局列表.它形成一个自定义表.

为了清理表格,我循环遍历所有布局并逐个取出项目.然后删除布局.

  // 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;
  }
Run Code Online (Sandbox Code Playgroud)

这似乎有效.但是当我再次开始填充表格时,我会看到清洁之前那些物品的"幽灵".大多数时候,他们都在新的对象后面.他们仍然工作.

当您仅使用带有小部件的布局时,也会发生这种情况.

我只是想清除整个布局布局而不删除内容小部件.清理布局的安全方法!

Rei*_*ica 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;
}
Run Code Online (Sandbox Code Playgroud)

断言是为了确保代码工作的布局与隐含的前提条件匹配:必须没有子布局,因为写入的代码不会递归到它们中.任何子布局及其小部件都会泄漏(不是内存泄漏,而是资源泄漏).如果违反前提条件,断言将中止执行.