2012-02-10 3 views
1

ウィジェットがQToolBoxに追加されると、ウィジェットの所有権はQToolBoxに移されますか?別の言い方をしている:それは新しい親になり、ウィジェット自体が破壊されたときにウィジェットを破壊するだろうか?QToolBoxはそのアイテムを所有していますか?

+0

チェックするのは簡単です。アイテムを追加した後、親を誰が参照してください。もっと重要なことに、親は 'QToolBox'内の内部ウィジェットである可能性があります。だからあなたが本当にやりたいことは、アイテムを追加してから、QToolBoxの子孫ツリーを繰り返し、あなたのウィジェットが現れるかどうかをチェックすることです。 –

答えて

4

new QWidget(pointer_to_toolbox);などを使用してウィジェットを構築する場合、ツールボックスはウィジェットの所有権を取得します。

addItem()のドキュメントには、所有権については何も言っていないので、私はツールボックスは、私がqtのソースコードからツールボックスを収集することができるものからaddItem()

0

これは実際にコードの構成に依存します。 qtoolboxに関連付けられたオブジェクトを再利用できるようにコードを設計することができます。より具体的にする必要があります。

+0

私のコードはここには何もありません。 QToolBoxの動作を知る必要があるので、漏れないようにコードを整理するか、segfaultにするか、オブジェクトツリーサークルを持つことができます。 – pmr

+0

QTはC++に基づいているため、OOPで定義されたオブジェクトと違いはありません。オブジェクトメンバを動的に割り当てると、このオブジェクトが削除されたときにその親への接続が緩くなります(これは、クラスメンバまたはトラフ集約として割り当てるかどうかによっても異なります)。また、QTのファンシーコードジェネレータ(特に信号とスロットのメカニズム)が値渡しというQTの内部設計と常に互換性があるとは限りません。 – olafpadme

+0

あなたはこの問題を理解していないのではないかと心配しています。 'QObject'(それをオブジェクトOと呼ぶ)から派生したものが'オブジェクトの所有権を奪うために 'AがOの子にされていると、そのデストラクタが呼び出されると直ちに子をすべて削除します。 Qtは何かが何かの所有権を奪ったときに完全にはっきりしないものであり、私の質問はそのような特定のケースで、何かの所有権を取るのが賢明だが明らかに行われていない。ここで 'moc'やシグナルやスロットについては何もありません。 – pmr

3

に渡された任意のウィジェットの所有権を取得しないことを賭けるだろうアイテムの所有権を取得しません。 1はQToolBoxは、独自のプライベート変数へwidgetパラメータへのポインタを代入するコードから見ることができるように

int QToolBox::insertItem(int index, QWidget *widget, const QIcon &icon, const QString &text) 
{ 
    if (!widget) 
     return -1; 

    Q_D(QToolBox); 
    connect(widget, SIGNAL(destroyed(QObject*)), this,SLOT(_q_widgetDestroyed(QObject*))); 

    QToolBoxPrivate::Page c; 
    c.widget = widget; 

    ... 
} 

:ここではsrc/GUI/qtoolbox.cppからinsertItem機能の抜粋です。ウィジェットが破壊されると、QToolBoxが通知されます。

P.S.私はgitからqtソースをチェックアウトしました。 にaddItemの実装が見つかりません。コメントはありますが、qtoolbox.hにしか宣言されていません。うーん....

関連する問題