2011-09-23 15 views

答えて

13

あなたはただあなたがnewを使用して作成した任意の他のポインタの場合と同様に

delete layout; 

を使用しています。

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

アイテムを削除する必要があります。レイアウト - > removeItem(アイテム)の後。またはあなたのプログラムでメモリリークが発生します。 perdenの答えをチェックしてください。 – Borzh

0

を、私はこの質問が古い知っていると答えたが、:QtAlgorithmsはqDelteAllを提供していますので、1とそのすべての子の削除を含む、レイアウトを削除することが可能です-ライナー。 https://stackoverflow.com/a/35751235/3292513

をこのコードはレイアウトを削除し、レイアウト内のすべての子供たちとすべてが「消える」:

これは、私はここに掲載テキストのrepuplicationです。ここ

qDeleteAll(yourWidget->children()); 

がオーバーロード機能の説明である:

空隙qDeleteAll(ForwardIteratorは、ForwardIterator端を開始する)

は、範囲内のすべての項目を削除Cを使用して、[、終了を開始] ++ delete>演算子を使用します。アイテムタイプはポインタタイプ(たとえばQWidget *)でなければなりません。

qDeleteAllにはそのウィジェット(そのレイアウトではない)のコンテナが必要です。また、qDeleteAllはyourWidget - その子のみを削除しないことに注意してください。

新しいレイアウトを設定できるようになりました。

関連する問題