2011-09-23 30 views

回答

13

你只需要使用

delete layout; 

就像你使用你使用new创建的任何其他指针。

12

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; 
+0

我认为这是不正确的,因为如果您在构造函数中传递父项,它将删除子项和子项目。 – Goombert

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; 
    } 
} 
+0

您应该删除项目; layout-> removeItem(item);或者你的程序中会有内存泄漏。退房perden答案。 – Borzh

0

我知道这个问题是老回答,但是:由于QtAlgorithms提供qDelteAll,可以删除布局,包括删除其所有的孩子有一个-衬垫。

这是我在这里贴文的repuplication:https://stackoverflow.com/a/35751235/3292513

此代码删除布局,所有的儿童和里面的一切布局“消失”。

qDeleteAll(yourWidget->children()); 

这里是重载函数的描述:

空隙qDeleteAll(ForwardIterator开始,ForwardIterator端)

删除在使用C范围[开始,结束]中的所有项目++删除>运营商。项目类型必须是指针类型(例如,QWidget *)。

请注意,qDeleteAll需要使用该小部件的容器(不是该布局)。并注意,qDeleteAll不会删除yourWidget - 只是它的孩子。

现在可以设置新的布局。