C++ 清理Qt布局和添加其他小部件不起作用。幽灵小工具留下来。Qt错误?

C++ 清理Qt布局和添加其他小部件不起作用。幽灵小工具留下来。Qt错误?,c++,qt,layout,qt4.7,C++,Qt,Layout,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 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;
  }
这似乎奏效了。但当我再次开始摆满桌子时,我看到了清洁前的“鬼影”。大多数情况下,它们都在线与线之间,在新的喷气式飞机后面。它们仍然有效

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


我只想在不删除内容小部件的情况下清理布局的整个布局。清理布局的安全方法

您删除的是布局项,而不是项目用来管理的小部件。您必须删除小部件。删除版面本身时,所有非版面项目将自动删除

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;
}

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

清除布局可以通过以下方式完成:

QLayoutItem* item;
while ( ( item = row->takeAt( 0 ) ) != NULL )
{
    delete item->widget();
    delete item;
}

我认为您没有删除小部件(插入小部件?)。尝试调用item->widget()并删除它。这是正确的。项目删除是不必要的,因为销毁基础布局将删除项目。但是如果出于某些目的我想离开第一个布局,那么我应该这样做吗?没有必要删除布局。使用上述代码,您可以清除布局并将其保留以插入新项目。它不起作用。您必须删除布局。我刚测试过。有了这个密码,鬼线就不会消失。我不得不删除布局并设置新的布局。