清理Qt布局并添加其他小部件不起作用.幽灵小部件留下来.Qt错误

Cleaning a Qt layout and adding other widgets does not work. Ghost widgets stay. Qt bug?

本文关键字:小部 Qt 不起作用 留下来 错误 幽灵 其他 布局 添加 清理      更新时间:2023-10-16

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

为了清理桌子,我遍历了所有布局并逐个取出项目。然后删除布局。

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