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。
我尝试了几种方法来做到这一点。
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添加项目时,会在之前添加的项目之上添加新项目。
我觉得我必须重绘,重新绘制,更新,刷新或其他东西。我试过ui->verticalLayout_2->update();
,但对我没用。
那么,我该怎么办?
答案 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
),或者自己保留窗口小部件和/或布局列表。