Qt 删除嵌套布局

Qt remove nested layout

本文关键字:布局 嵌套 删除 Qt      更新时间:2023-10-16

我有几个QHBoxLayout对象嵌套在一个QVBoxLayout中。我已经查看了许多堆栈溢出问题和答案,但我无法找到完全删除QScrollArea小部件内容的布局的方法。我看到的所有答案都只是使再次设置布局成为可能,但是当布局第二次设置时,对象仍然存在。

这是我正在使用的代码:

QSignalMapper* sMap = new QSignalMapper(this);
QVBoxLayout* vBox = new QVBoxLayout();
outerVector = 0;
for (vector<vector<QPushButton*>>::iterator o_iter = buttonGrid.begin(); o_iter < buttonGrid.end(); o_iter++) {
int innerVector = 0;
QHBoxLayout* hBox = new QHBoxLayout();
for (vector<QPushButton*>::iterator i_iter = (*o_iter).begin(); i_iter < (*o_iter).end(); i_iter++) {
hBox->addWidget(buttonGrid.at(outerVector).at(innerVector));
sMap->setMapping(buttonGrid.at(outerVector).at(innerVector), ((outerVector * 100) + innerVector));
connect(buttonGrid.at(outerVector).at(innerVector), SIGNAL(clicked()), sMap, SLOT(map()));
innerVector++;
}
vBox->addLayout(hBox);
outerVector++;
}
ui->GameAreaWidgetContents->setLayout(vBox);
connect(sMap, SIGNAL(mapped(int)), this, SLOT(on_buttonGrid_clicked(int)));

现在,我有这个来清除布局:

delete hBox;
delete vBox;
ui->GameAreaWidgetContents->layout();

清除小部件内容的最佳和最有效的方法是什么?

我相信我已经解决了这个问题,这不是Qt问题,而是缺乏清除vector<vector<QPushButton*>> buttonGrid对象。看起来布局没有被清除,因为额外的QPushButton对象被添加到vector<vector<QPushButton*>>对象上。

对我来说,这是一个相当新手的错误。

更新: 我推断GameAreaWidgetContents是一个QScrollArea.要清除其布局管理器,您可以执行以下操作:

delete ui->GameAreaWidgetContents->layout();

vbox将不再是小部件的布局管理器,任何嵌套的子项都将被Qt父系统自动删除。

QWidget::setLayout()上的文档:

如果此小部件上已经安装了布局管理器,QWidget将不允许您安装另一个布局管理器。必须先删除现有的布局管理器(由 layout() 返回),然后才能使用新布局调用 setLayout()。