2011-05-17 14 views
8

deleteを使用してQWidgetを削除した場合、GUIから登録解除されるのですか、手動で行う必要がありますか?この動作の論理的な理由はありますか?QWidgetは破壊時にGUIから自分自身を削除しますか?

+0

「登録解除」とはどういう意味ですか? – Troubadour

+0

ウィンドウにウィジェットを追加するには、私は 'addWidget'呼び出しを行う必要があります。同様に、ウィジェットをウィンドウから削除するには 'removeWidget'を実行できます。私はウィジェットが 'delete''dされているときにウィジェットが登録されていれば、これを自動的に行うかどうか知りたいです。 – Pieter

+2

Qtはオーナーシップシステムを使用していますので、他の人が所有しているウィジェットを手動で削除しないでください(親はそれらを削除します)。 –

答えて

12

レイアウトまたはスタックウィジェットでaddWidgetを呼び出すと、ウィジェットの所有権がレイアウト/スタックウィジェットに転送されます。つまり、レイアウト/スタックされたウィジェットが削除されると、追加されたすべてのウィジェットも削除されます。

の所有者に関係なく、ウィジェットを削除しても問題ありません。。所有権は、単にオブジェクトの階層のメモリをクリアする便利な方法です。それを所有するオブジェクトが削除しなければならないとは決して言いません。それが事実ならば、いったんすべてのウィジェットを追加すれば、それらをすべて削除することも、まったく削除することもできなくなります!

レイアウト/スタックウィジェットが削除されたときにウィジェットを削除したくない場合は、removeWidgetを呼び出します。ウィジェットの所有権がどこに行くのかははっきりしないことに注意してください。簡単なテストアプリ。私はちょうどが所有権をQStackedWidgetから全く移さなかったことを示唆しました!

あなたの質問に答えるために、Qtは削除したレイアウト/積み重なったウィジェットからウィジェットを正しく削除します。さらに、これは正しいウィジェットがレイアウト/スタックウィジェットに属していない場合にウィジェットを削除する方法です。

+0

"Qtはレイアウト/積み重なったウィジェットを削除すると、そのウィジェットを正しく削除します。"それはウィジェットまたはレイアウトを参照する最後のものなのでしょうか? – Pieter

+0

ウィジェットはあなたの質問です –

+0

ただチェックしています:)ありがとうございました! – Pieter

7

すでに@CatPlusPlusによって指摘されているように、Qtは所有権システムを使用しています。ウィジェットをウィジェットなどのレイアウトやレイアウトに追加すると、そのアドオンの所有権が加算器/親に与えられます。これは、通常、メソッドのドキュメントに記載されています。たとえば、QWidget :: addLayout(QLayout *)のドキュメントを見ると、QwidgetはQLayoutの所有権を取得すると言います。親を削除すると、その子もすべて削除されます。 詳細については、この記事をお読みください。

Object Trees and Ownership in Qt

伝統的なC++で開発者がヒープに割り当てられたメモリのすべてのビットを追跡する必要があるため、この方法では、非常に便利です。しかし、この所有システムでは、開発者が両親を追跡する必要があります。

+5

+1これは質問に直接答えるものではありませんが(質問ははい/いいえの質問としましたが、この答えのリンクには、「ツリー内のQObjectが削除されたとき、オブジェクトに親がある場合、デストラクタはそのオブジェクトをその親から自動的に削除します」という回答が含まれています。だから+1。 – blwy10

関連する問題