从 http://doc.qt.io/qt-5.9/qwidget.html#setLayout必须先删除现有的布局管理器(由 布局()返回)后,才能调用的setLayout()的新布局。如何删除小部件上已有的布局?
哪个函数
用于删除以前的布局?
从 http://doc.qt.io/qt-5.9/qwidget.html#setLayout必须先删除现有的布局管理器(由 布局()返回)后,才能调用的setLayout()的新布局。如何删除小部件上已有的布局?
哪个函数
用于删除以前的布局?
你只需要使用
delete layout;
就像你使用你使用new
创建的任何其他指针。
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;
我想删除当前布局,将其替换为新布局,但保留布局管理的所有小部件。我发现在这种情况下,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;
}
}
您应该删除项目; layout-> removeItem(item);或者你的程序中会有内存泄漏。退房perden答案。 – Borzh
我知道这个问题是老回答,但是:由于QtAlgorithms提供qDelteAll,可以删除布局,包括删除其所有的孩子有一个-衬垫。
这是我在这里贴文的repuplication:https://stackoverflow.com/a/35751235/3292513
此代码删除布局,所有的儿童和里面的一切布局“消失”。
qDeleteAll(yourWidget->children());
这里是重载函数的描述:
空隙qDeleteAll(ForwardIterator开始,ForwardIterator端)
删除在使用C范围[开始,结束]中的所有项目++删除>运营商。项目类型必须是指针类型(例如,QWidget *)。
请注意,qDeleteAll需要使用该小部件的容器(不是该布局)。并注意,qDeleteAll不会删除yourWidget
- 只是它的孩子。
现在可以设置新的布局。
我认为这是不正确的,因为如果您在构造函数中传递父项,它将删除子项和子项目。 – Goombert