20

ここの例を見ていて、メモリリークがないかどうか疑問に思っていました。サブジェクトmem leak on deleteについて話している記事を赤くしました。ただし、QWidgets は追加されたウィジェットの所有権を保持しますが、レイアウトは保持しません。

QT コードから、レイアウトを持つ親がこのレイアウトのすべてのウィジェットの所有権を取得しているようです。ただし、ドキュメントでこれに関する参照は見られませんでした。

Window::Window()
{
 editor = new QTextEdit();
 QPushButton *sendButton = new QPushButton(tr("&Send message"));

 connect(sendButton, SIGNAL(clicked()), this, SLOT(sendMessage()));

 QHBoxLayout *buttonLayout = new QHBoxLayout();
 buttonLayout->addStretch();
 buttonLayout->addWidget(sendButton);
 buttonLayout->addStretch();

 QVBoxLayout *layout = new QVBoxLayout(this);
 layout->addWidget(editor);
 layout->addLayout(buttonLayout);

 setWindowTitle(tr("Custom Type Sending"));
}
4

3 に答える 3

28

レイアウト管理から:

レイアウトの使用に関するヒント

レイアウトを使用する場合、子ウィジェットを作成するときに親を渡す必要はありません。レイアウトは、レイアウトがインストールされているウィジェットの子になるように、(QWidget::setParent() を使用して)ウィジェットの親を自動的に変更します。

注: レイアウト内のウィジェットは、レイアウト自体ではなく、レイアウトがインストールされているウィジェットの子です。ウィジェットは、レイアウトではなく、他のウィジェットのみを親として持つことができます。

レイアウトで addLayout() を使用してレイアウトをネストできます。内部レイアウトは、挿入先のレイアウトの子になります。

于 2012-04-17T17:14:08.970 に答える
3

いいえ、QLayout はマネージド QWidget の所有権を取得しません。

の実装は次のaddWidget()とおりです。

void QLayout::addWidget(QWidget *w)
{
    addChildWidget(w);
    addItem(QLayoutPrivate::createWidgetItem(this, w));
}

説明:

  1. addChildWidget()管理ウィジェット w が他のレイアウトから確実に削除されるようにするだけです。

  2. createWidgetItem(this, w)新しい QWidgetItem を割り当てます。この QWidgetItem は w へのポインターを格納しますが、 wの所有権は取得しません

  3. addItem()アイテムをレイアウトに追加し、 QWidgetItem の所有権を取得します ( QWidgetItem によって監視される QWidget の所有権ではありません)。これは、QLayout が破棄されると QWidgetItem が破棄されることを意味します。ただし、QWidget w はまだ破棄されません。

親の QWidget が破棄されると、QWidget も破棄されます。このような親は、parent->setLayout(layout) が呼び出されたときに QLayout によって自動的に割り当てられます。

于 2016-06-23T23:18:43.253 に答える