ウィジェットがQToolBoxに追加されると、ウィジェットの所有権はQToolBoxに移されますか?別の言い方をしている:それは新しい親になり、ウィジェット自体が破壊されたときにウィジェットを破壊するだろうか?QToolBoxはそのアイテムを所有していますか?
答えて
new QWidget(pointer_to_toolbox);
などを使用してウィジェットを構築する場合、ツールボックスはウィジェットの所有権を取得します。
addItem()のドキュメントには、所有権については何も言っていないので、私はツールボックスは、私がqtのソースコードからツールボックスを収集することができるものからaddItem()
これは実際にコードの構成に依存します。 qtoolboxに関連付けられたオブジェクトを再利用できるようにコードを設計することができます。より具体的にする必要があります。
私のコードはここには何もありません。 QToolBoxの動作を知る必要があるので、漏れないようにコードを整理するか、segfaultにするか、オブジェクトツリーサークルを持つことができます。 – pmr
QTはC++に基づいているため、OOPで定義されたオブジェクトと違いはありません。オブジェクトメンバを動的に割り当てると、このオブジェクトが削除されたときにその親への接続が緩くなります(これは、クラスメンバまたはトラフ集約として割り当てるかどうかによっても異なります)。また、QTのファンシーコードジェネレータ(特に信号とスロットのメカニズム)が値渡しというQTの内部設計と常に互換性があるとは限りません。 – olafpadme
あなたはこの問題を理解していないのではないかと心配しています。 'QObject'(それをオブジェクトOと呼ぶ)から派生したものが'オブジェクトの所有権を奪うために 'AがOの子にされていると、そのデストラクタが呼び出されると直ちに子をすべて削除します。 Qtは何かが何かの所有権を奪ったときに完全にはっきりしないものであり、私の質問はそのような特定のケースで、何かの所有権を取るのが賢明だが明らかに行われていない。ここで 'moc'やシグナルやスロットについては何もありません。 – pmr
に渡された任意のウィジェットの所有権を取得しないことを賭けるだろうアイテムの所有権を取得しません。 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
にしか宣言されていません。うーん....
- 1. IABエラーあなたは既にこのアイテムを所有しています
- 2. Getterがインスタンス変数の所有者であると言うのは有効でしょうか?または誰がそれを所有していますか?
- 3. どのクラスがアンマネージリソースを所有していますか(そしてIDisposableを実装していますか?)
- 4. Collectionviewsource - different Threadそれを所有しています
- 5. QToolBoxでは、ページのコンテンツサイズのみを設定しますか?
- 6. QToolboxアイテムにウィジェットを追加する方法
- 7. std :: exceptionは何を所有していますか?
- 8. QByteArrayはそのメモリ(QByteArray :: fromRawData)を所有していることを確認し
- 9. JDialogとその所有者
- 10. 誰がシーケンス図のメソッドを所有していますか?
- 11. Java仮想マシン:共有しているか、すべてのアプリケーションを所有していますか?
- 12. クラスは他のクラスのNSArrayをコピーし、それをはっきりと所有しています
- 13. 錆のスライスの所有権がそのスコープを超えています
- 14. 誰がNSWindowControllerを所有していますか?
- 15. ビュー所有者とデータベースからアイテムを削除する
- 16. ドメインの所有者は、そこからダウンロードしたすべてのファイルを監視できますか?
- 17. 特定の所有者を持つ(または所有していない)ファイルを見つける
- 18. retainを使用してオートリリースオブジェクトの所有権を取得していますか?
- 19. nodetoolステータスの所有権のパーセンテージは、何を指していますか?
- 20. なぜUIImageViewはUIImageを所有していますか?それはMVCの原則に違反していますか?
- 21. このアイテムを既に所有しているとエラーが発生しました
- 22. QtのQToolBoxコントロールからツールバーを削除するには?
- 23. Array.prototype.forEach() - そのメソッドのコードがビットシフト演算子を所有しているのはなぜですか?
- 24. rdbuf(...)はポインタを返します - 指しているバッファを所有していますか?
- 25. Windowsの開いているファイルハンドルの所有者プロセスをリストしますか?
- 26. デバイスを所有していないiTunesにアプリを送信しますか?
- 27. Airbnbはどこにその場所を保管していますか?
- 28. CloudFormation - ユーザーはネットワークACLを所有していません
- 29. gulp chownは所有者を変更していません
- 30. GoogleカレンダーAPIを使用してサービスアカウントで作成したカレンダーを所有しているユーザーと、そのユーザーをどのように共有できますか?
チェックするのは簡単です。アイテムを追加した後、親を誰が参照してください。もっと重要なことに、親は 'QToolBox'内の内部ウィジェットである可能性があります。だからあなたが本当にやりたいことは、アイテムを追加してから、QToolBoxの子孫ツリーを繰り返し、あなたのウィジェットが現れるかどうかをチェックすることです。 –