您必须先 删除现有的布局管理器(由...返回) layout()) ,然后才能使用新布局调用setLayout()。
来自http://doc.qt.io/qt-5.9/qwidget.html#setLayout
哪个函数用于删除先前的布局?
答案 0 :(得分: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;
答案 1 :(得分:14)
你只需使用
delete layout;
就像使用new
创建的任何其他指针一样。
答案 2 :(得分:3)
我想删除当前布局,将其替换为新布局,但保持布局管理所有窗口小部件。我发现在这种情况下,Chris Wilson的解决方案效果不佳。布局并不总是改变。
这对我有用:
void RemoveLayout (QWidget* widget)
{
QLayout* layout = widget->layout ();
if (layout != 0)
{
QLayoutItem *item;
while ((item = layout->takeAt(0)) != 0)
layout->removeItem (item);
delete layout;
}
}
答案 3 :(得分:1)
我知道这个问题很老并且已经回答了,但是:由于QtAlgorithms提供了qDelteAll,因此可以删除布局,包括删除所有子版本的单行。
这是我在此处发布的文字的重复版:https://stackoverflow.com/a/35751235/3292513
此代码删除布局,其所有子项以及布局内的所有内容都“消失”。
qDeleteAll(yourWidget->children());
以下是重载函数的说明:
void qDeleteAll(ForwardIterator begin,ForwardIterator end)
使用C ++ delete>删除[开始,结束]范围内的所有项目。运营商。项类型必须是指针类型(例如,QWidget *)。
请注意,qDeleteAll需要从该窗口小部件(而不是该布局)提供容器。请注意,qDeleteAll不会删除yourWidget
- 只删除它的子项。
现在可以设置新的布局。