2013-09-21 80 views
5

我有一个QVBoxLayoutscrollArea。我动态地添加QFormLayout s。从QVBoxLayout删除所有的孩子

widgetTreeStruct* tree = new widgetTreeStruct(QString::number(numberOfGraphs)); 
QFormLayout* layout = tree->getTree(); // get QFormLayout 
ui->verticalLayout_2->addLayout(layout); //add to the vertical layout 

在一个点上,我需要从QVBoxLayout删除所有添加的QFormLayouts

我尝试了几种方法来做到这一点。

  1. 使用qDeleteAll()

qDeleteAll(ui->verticalLayout_2->children());

2.删除项目逐一

QLayoutItem* child; 
      while((child = ui->verticalLayout_2->takeAt(0)) != 0) 
      { 
       if(child->widget() != 0) 
       { 
        delete child->widget(); 
       } 

       delete child; 
      } 

但是什么都没有发生。只有当我尝试将项目添加到QVBoxLayout时,再次将新项目添加到先前添加的项目之上。

After added items to QVBoxLayout

我感觉到,我不得不重新绘制,重绘,更新,刷新或什么的。我试过ui->verticalLayout_2->update();,但没有为我工作。

那么,我该怎么办?

回答

7

我递归删除所有的孩子,它为我工作。

这是我的代码。

void Widget::remove(QLayout* layout) 
{ 
    QLayoutItem* child; 
    while(layout->count()!=0) 
    { 
     child = layout->takeAt(0); 
     if(child->layout() != 0) 
     { 
      remove(child->layout()); 
     } 
     else if(child->widget() != 0) 
     { 
      delete child->widget(); 
     } 

     delete child; 
    } 
} 

remove(ui->verticalLayout_2); 
+0

事实上,这是正确的做法。 +1 –

1

也许是小部件的父是含部件,而不是他们的布局(即为传递给它们的构造函数的参数parent?)。

也许QObject::dumpObjectTree()可以帮助你了解亲子关系。

您的方法2(不依赖小部件作为QObject布局中的子项)会发生什么,它会使用takeAt()方法从布局中删除所有项目,但不会删除任何项目:子项您的顶级QVBoxLayoutQFormLayout s,因此拨打widget()对其QLayoutItems返回0。只需使用delete child无条件删除子女QLayout即可。但是,这仍然不会删除小孩小工具。您可以在子布局上递归调用takeAt(),或者删除父窗口小部件的所有子项(您的QScrollArea),或者保留自己的窗口小部件和/或布局列表。

+0

当我尝试删除所有来自'QVBoxLayout'孩子,然后再添加其他小部件'QVBoxLayout',我可以看到出现在前面的小部件之上的新的widget。这表明widgets实际上是'QVBobLayout'的子项,实际上它们已被删除。对?但唯一的事情是他们需要清除或隐藏窗口。如果我错了,请纠正我。 –

+0

它们不会被删除,只会因为使用了widget()而从布局中删除。看到我上面的编辑。 – Oberon

相关问题