【问题标题】:Cleaning a Qt layout and adding other widgets does not work. Ghost widgets stay. Qt bug?清理 Qt 布局并添加其他小部件不起作用。幽灵小部件保留。 Qt 错误?
【发布时间】:2014-04-07 16:59:25
【问题描述】:

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

要清理桌子,我会遍历所有布局并一一取出物品。然后删除布局。

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

这似乎有效。但是当我再次开始填满桌子时,我看到清洁前的物品“幽灵”。大多数时候,它们位于线条之间,位于新对象的后面。而且它们仍然有效。

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

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

【问题讨论】:

  • 我认为您没有删除小部件(您插入小部件?)。尝试调用 item->widget() 并删除它。

标签: c++ qt layout qt4.7


【解决方案1】:

您正在删除布局项目,而不是项目用于管理的小部件。您必须删除小部件。当您删除布局本身时,所有非布局项将被自动删除。

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 匹配:必须没有子布局,因为编写的代码不会递归到它们中。任何带有小部件的子布局都会泄漏(不是内存泄漏,而是资源泄漏)。如果违反前提条件,断言将中止执行。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是正确的。项目删除是不必要的,因为底层布局的破坏将删除项目。
    • 但是如果出于某些目的我想保留第一个布局,我应该这样做吗?
    • 不需要删除布局。使用上面的代码,您可以清除布局并保留它以插入新项目。
    • 它不起作用。您必须删除布局。我刚刚测试了它。仅使用此代码,幽灵线就会保留。我不得不删除布局并设置新布局。
    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 2013-05-01
    • 2012-06-03
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2015-03-24
    相关资源
    最近更新 更多