从QVBoxLayout中删除所有子项

时间:2013-09-21 15:29:10

标签: c++ qt

QVBoxLayout内有一个scrollArea。我动态添加QFormLayout s。

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

有一次,我需要从QFormLayouts中删除所有已添加的QVBoxLayout

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

  1. 使用qDeleteAll()
  2.   

    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();,但对我没用。

    那么,我该怎么办?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

小部件的父级可能包含小部件,而不是它们的布局(传递给parent参数的构造函数的内容?)。

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

您的方法2(不依赖于QObject - 布局意义上的小部件的小部件)会发生什么情况,它会使用takeAt()方法从布局中删除所有项目但是不删除任何内容:您的顶级QVBoxLayout的子项为QFormLayout,因此在widget()上调用QLayoutItems会返回0。只需无条件地使用delete child删除子QLayout。但是,这仍然不会删除子小部件。您可以递归调用子布局上的takeAt()或删除父窗口小部件的所有子窗口(您的QScrollArea),或者自己保留窗口小部件和/或布局列表。