6

レイアウトで実行delete widgetするとどうなりますか?widgetこのケースがドキュメントに書かれている場合は、リンクを教えてください(見つかりませんでした)。

コード例:

QLabel *l1 = new QLabel("1st");
QLabel *l2 = new QLabel("2nd");
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(l1);
layout->addWidget(l2);

QWidget *mainWidget = new QWidget;
mainWidget->setLayout(layout);
mainWidget->show();

delete l1;
l2->deleteLater();

起こることはとで違うのl1でしょl2うか?

4

4 に答える 4

3

QLayoutは、タイプChildRemovedのイベントをリッスンし、それに応じてアイテムを削除します。ウィジェットを削除するだけで安全です。

@FrankOsterfeld によってここに

于 2012-09-07T14:47:53.473 に答える
3

私はあなたがしていることはほとんど同じだと信じていますが、どちらもあなたがそれをしているべき方法をレイアウトから適切に削除することはありません。それらはまだレイアウトに悪い参照として残されています(私が正しく覚えている場合)

最初のものは単に今アイテムを削除します。2つ目は、コントロールがイベントループに戻ると、それを削除します。しかし実際には、人々が通常レイアウトからアイテムを削除する方法は、レイアウトからアイテムを削除し(それ自体を調整する機会を与える)、次にアイテムとそのウィジェットを削除することです(必要な場合)。

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) {
    delete child->widget();
    delete child;
}

繰り返しになりますが、ウィジェット()の削除は、child->widget()それを保持していたレイアウトアイテムに加えて、追加されたウィジェットを破棄する場合にのみ必要です。

于 2012-08-18T18:22:20.317 に答える
1

アクティブなスロットが接続されているQobjectsでdeletel1を使用しないでください。クラッシュが発生します。使用:l1-> hidden(); l1-> deleteLater(); それは私にとってはうまくいきます

于 2012-09-08T15:11:50.540 に答える
0

一般的に、私はQtウィジェットを削除するのではなく、適切なレイアウトから削除します。(ウィンドウを閉じるときに削除属性を設定すると、Qtは独自のウィジェットを削除します。 )後でdeleteを呼び出すこととdeleteを呼び出すことの違いは、デストラクタを呼び出してオブジェクトに関連付けられたメモリを解放する delete通常のC++削除操作です。

Qtのドキュメントで説明されているように、このdeleteLater()メソッドは、イベントループに入ったときにオブジェクトを削除します。

于 2012-08-18T18:45:35.627 に答える