2011-09-23 31 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 - 只是它的孩子。

現在可以設置新的佈局。