オブジェクト・ツリーと所有権

概要

QObjects オブジェクトはオブジェクトツリーで構成されます。別のオブジェクトを親に持つ を作成すると、そのオブジェクトは親の ()リストに追加され、親が削除されると削除されます。このアプローチは、GUIオブジェクトのニーズに非常によく合うことがわかりました。例えば、 (キーボード・ショートカット)は関連するウィンドウの子なので、ユーザーがそのウィンドウを閉じると、ショートカットも削除されます。QObject children QShortcut

QQuickItem Qt Quick 、基本的なビジュアル要素である を継承していますが、QObjectQObject の親とは異なるビジュアル親の概念を持っています。アイテムの視覚的親は必ずしもオブジェクトの親と同じとは限りません。詳しくは Qt Quick の Concepts - Visual Parentを参照してください。

QWidget Qt Widgets モジュールの基本クラスである Child は、親子関係を拡張します。つまり、親の座標系で表示され、親の境界によってグラフィカルにクリッピングされます。例えば、アプリケーションでメッセージ・ボックスを閉じた後に削除すると、メッセージ・ボックスのボタンとラベルも削除されます。

子オブジェクトを自分で削除することもできます。例えば、ユーザーがツールバーを削除すると、アプリケーションはそのQToolBar オブジェクトの1つを削除することになるかもしれません。その場合、ツールバーのQMainWindow 親はその変更を検出し、それに応じてスクリーン・スペースを再構成します。

デバッグ関数QObject::dumpObjectTree ()とQObject::dumpObjectInfo ()は、アプリケーションが奇妙に見えたり動作したりするときに、しばしば役に立ちます。

Qオブジェクトの構築/破壊順序

QObjects がヒープ上に作成されたとき(つまりnew で作成されたとき)、そこから任意の順序でツリーを構築することができます。ツリー内のQObject が削除されるとき、そのオブジェクトに親があれば、デストラクタは自動的にそのオブジェクトを親から削除します。オブジェクトに子がある場合、デストラクタは自動的にそれぞれの子を削除します。破壊の順番に関係なく、QObject が2回削除されることはありません。

スタック上にQObjects が作成された場合も、同じ動作が適用されます。通常、破壊の順番は問題になりません。次のスニペットを考えてみよう:

int main()
{
    QWidget window;
    QPushButton quit("Quit", &window);
    ...
}

親であるwindow と子であるquit はどちらもQObjects である。なぜならQPushButtonQWidget を継承し、QWidgetQObject を継承するからである。quit C++言語標準(ISO/IEC 14882:2003)では、ローカル・オブジェクトのデストラクタはコンストラクタと逆の順序で呼び出されると規定されているからです。したがって、子オブジェクトであるquit のデストラクタが最初に呼び出され、window のデストラクタが呼び出される前に、親オブジェクトであるwindow から削除されます。

しかしここで、この2番目のスニペットに示されているように、構築の順序を入れ替えたらどうなるかを考えてみよう:

int main()
{
    QPushButton quit("Quit");
    QWidget window;

    quit.setParent(&window);
    ...
}

この場合、破壊の順番が問題になる。親のデストラクタが最初に呼ばれる。次に、その子であるquit のデストラクタを呼び出します。quit はローカル変数なので、これは正しくありません。その後、quit がスコープ外に出ると、そのデストラクタが再び呼び出され、今度は正しく呼び出されますが、ダメージはすでに終わっています。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.