あなたが最初() レイアウト(で返される)は、既存のレイアウトマネージャを削除する必要があります新しいレイアウトでsetLayoutの()を呼び出すことができます前に。以前のレイアウトを削除するために使用される機能http://doc.qt.io/qt-5.9/qwidget.html#setLayoutウィジェットで既存のレイアウトを削除するにはどうすればよいですか?
から
?
あなたが最初() レイアウト(で返される)は、既存のレイアウトマネージャを削除する必要があります新しいレイアウトでsetLayoutの()を呼び出すことができます前に。以前のレイアウトを削除するために使用される機能http://doc.qt.io/qt-5.9/qwidget.html#setLayoutウィジェットで既存のレイアウトを削除するにはどうすればよいですか?
から
?
あなたはただあなたがnew
を使用して作成した任意の他のポインタの場合と同様に
delete layout;
を使用しています。
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;
}
}
アイテムを削除する必要があります。レイアウト - > removeItem(アイテム)の後。またはあなたのプログラムでメモリリークが発生します。 perdenの答えをチェックしてください。 – Borzh
を、私はこの質問が古い知っていると答えたが、:QtAlgorithmsはqDelteAllを提供していますので、1とそのすべての子の削除を含む、レイアウトを削除することが可能です-ライナー。 https://stackoverflow.com/a/35751235/3292513
をこのコードはレイアウトを削除し、レイアウト内のすべての子供たちとすべてが「消える」:
これは、私はここに掲載テキストのrepuplicationです。ここ
qDeleteAll(yourWidget->children());
がオーバーロード機能の説明である:
空隙qDeleteAll(ForwardIteratorは、ForwardIterator端を開始する)
は、範囲内のすべての項目を削除Cを使用して、[、終了を開始] ++ delete>演算子を使用します。アイテムタイプはポインタタイプ(たとえばQWidget *)でなければなりません。
qDeleteAllにはそのウィジェット(そのレイアウトではない)のコンテナが必要です。また、qDeleteAllはyourWidget
- その子のみを削除しないことに注意してください。
新しいレイアウトを設定できるようになりました。
私は、コンストラクタに親を渡すと、子とサブレイアウトが削除されるため、これは間違っていると思います。 – Goombert