2012-04-17 10 views
11

私は例hereを見ていて、メモリリークがないかどうか疑問に思っていました。私は副題mem leak on deleteについて話している記事を赤色にしました。しかし、QWidgetsは、ウィジェットに追加されたウィジェットの所有権を保持していますが、レイアウトはそうではありません。QBoxLayoutのオーナーは、すべてのレイアウトウィジェットのオーナーになりますか?

レイアウトを持つ親がこのレイアウトのすべてのウィジェットの所有権を取得しているようです。しかし、私はドキュメントのこれの任意の参照を見たことができませんでした。 Layout Managementから

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")); 
} 
+0

基本レイアウトクラス(QLayout)は、 'addWidget'が' addItem'を呼び出し、... 'addItem'が次のように言っています:*" ** Note:** itemの所有権レイアウトに転送され、それを削除するのはレイアウトの責任です」* http://doc.qt.nokia.com/4.7-snapshot/qlayout。html#addItem – HostileFork

+0

@HostileFork * item *の所有権がレイアウトに転送されます。ウィジェット自体の所有権ではありません。この点を明確にしようとする私の[回答](http://stackoverflow.com/a/38003370/1951907)を参照してください。 – Boris

答えて

15

:あなたはレイアウトを使用する場合のレイアウト

を使用するための

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

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

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

+1

これを探しませんでした。あなたの答えをありがとう。 – Anton

+0

これに加えて、レイアウトには「所有権」が与えられ、親の割り当てはレイアウトの親ウィジェットに対して行われます。http://doc.trolltech.com/4.7/qlayout.html#addItem – jdi

+0

@ item * * item *の所有権がレイアウトに転送されます。ウィジェット自体の所有権ではありません。この点を明確にしようとする私の[回答](http://stackoverflow.com/a/38003370/1951907)を参照してください。 QWidgetの所有者(メモリ管理の意味で)は、常にその親ウィジェットであるため、レイアウトにすることはできません。 – Boris

2

いいえ、QLayoutsは管理対象のQWidgetsの所有権を取得しません。ここ

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はまだ破棄されません。

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

関連する問題