您必须先删除现有布局管理器(由layout()返回),然后才能使用新布局调用setLayout().
来自http://doc.qt.io/qt-5.9/qwidget.html#setLayout
哪个功能用于删除以前的布局?
per*_*den 15
Chris Wilson的回答是正确的,但我发现布局不会删除它下面的子布局和qwidgets.如果您有复杂的布局或者可能存在内存泄漏,最好手动执行此操作.
QLayout * layout = new QWhateverLayout();
// ... create complicated layout ...
// completely delete layout and sublayouts
QLayoutItem * item;
QLayout * sublayout;
QWidget * widget;
while ((item = layout->takeAt(0))) {
if ((sublayout = item->layout()) != 0) {/* do the same for sublayout*/}
else if ((widget = item->widget()) != 0) {widget->hide(); delete widget;}
else {delete item;}
}
// then finally
delete layout;
Run Code Online (Sandbox Code Playgroud)
此代码删除布局、其所有子布局以及布局内的所有内容“消失”。
qDeleteAll(yourWidget->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly));
delete layout();
Run Code Online (Sandbox Code Playgroud)
这将删除该小部件的所有直接yourWidget小部件。使用Qt::FindDirectChildrenOnly是必不可少的,因为它可以防止删除同样在列表中并且可能已经被内部循环删除的小部件的子小部件qDeleteAll。
以下是 的描述qDeleteAll:
void qDeleteAll(ForwardIterator 开始, ForwardIterator 结束)
使用 C++ 删除 > 运算符删除 [begin, end] 范围内的所有项目。项目类型必须是指针类型(例如,QWidget *)。
请注意,qDeleteAll需要使用该小部件(而不是布局)中的容器来调用。请注意,它qDeleteAll不会删除yourWidget- 只是它的子项。
现在可以设置新的布局。