オブジェクトモデル
標準C++オブジェクト・モデルは、オブジェクト・パラダイムに対して非常に効率的なランタイム・サポートを提供する。しかし、その静的な性質は、特定の問題領域では柔軟性に欠ける。グラフィカル・ユーザー・インターフェイス・プログラミングは、実行時の効率と高い柔軟性の両方を必要とする領域です。Qtは、C++のスピードとQtオブジェクトモデルの柔軟性を組み合わせることで、これを提供します。
QtはC++にこれらの機能を追加している:
- シグナルとスロットと呼ばれる、シームレスなオブジェクト通信のための非常に強力なメカニズム
- クエリ可能で設計可能なオブジェクト・プロパティ
- 強力なイベントとイベントフィルター
- 国際化のためのコンテクスト文字列変換
- イベント駆動型GUIで多くのタスクをエレガントに統合できる洗練されたインターバル駆動タイマー
- オブジェクトの所有権を自然な形で整理する階層的で問い合わせ可能なオブジェクトツリー
- 参照オブジェクトが破棄されると自動的に0に設定されるガード付きポインタ(QPointer)。オブジェクトが破棄されるとダングリングポインタになる通常のC++ポインタとは異なります。
- ライブラリの境界を越えて動作する動的キャスト。
- カスタム型作成のサポート。
これらの Qt 機能の多くは、QObject からの継承に基づく、標準的な C++ テクニックで実装されています。その他、オブジェクト通信メカニズムやダイナミック・プロパティ・システムなどは、Qt独自のメタ・オブジェクト・コンパイラ(moc)が提供するメタ・オブジェクト・システムを必要とします。
メタ・オブジェクト・システムはC++の拡張で、真のコンポーネントGUIプログラミングに適した言語です。
重要なクラス
これらのクラスは Qt オブジェクトモデルの基礎となります。
クラスに関する追加情報 | |
シーケンシャル・コンテナと連想コンテナの共通機能 | |
列挙子に関するメタデータ | |
メンバ関数に関するメタデータ | |
Qt オブジェクトに関するメタ情報 | |
プロパティに関するメタデータ | |
シーケンシャル・コンテナへの型消去アクセスを許可する | |
メタ・オブジェクト・システムにおける名前付き型の管理 | |
すべての Qt オブジェクトの基底クラス | |
複数の QObject のライフタイムを監視します。 | |
QObject へのガード付きポインタを提供するテンプレート・クラス。 | |
QObject::blockSignals() の例外安全ラッパー。 | |
識別可能な送信者からのシグナルを束ねる | |
最も一般的な Qt データ型のユニオンのように動作します。 |
Qt オブジェクト:識別と値
Qt Object Model に追加された機能の中には、Qt Object を値ではなく ID として考える必要があるものがあります。値はコピーされたり割り当てられたりしますが、アイデンティティはクローンされます。クローンとは新しいIDを作成することで、古いIDの完全なコピーではありません。例えば、双子は異なるアイデンティティを持っています。見た目は同じでも、名前も住んでいる場所も違うし、ソーシャルネットワークもまったく違うかもしれない。
そうなると、アイデンティティのクローンを作ることは、コピーや値の割り当てよりも複雑な操作となる。これが何を意味するかは、Qtオブジェクト・モデルを見ればわかります。
Qt オブジェクト...
- は一意なQObject::objectName() を持っているかもしれません。Qt オブジェクトをコピーする場合、そのコピーにはどのような名前を付けるべきでしょうか?
- Qtオブジェクトをコピーする場合、そのコピーにはどのような名前を付けるべきでしょうか?Qt オブジェクトをコピーする場合、コピーの場所はどこになりますか?
- Qt オブジェクトは、他の Qt オブジェクトと接続することができます。Qt オブジェクトをコピーする場合、これらの接続をどのようにコピーに転送すればよいでしょうか?
- Qt オブジェクトは、実行時に C++ クラスで宣言されていない新しいプロパティを追加することができます。Qt オブジェクトをコピーする場合、元のオブジェクトに追加されたプロパティもコピーに含めるべきでしょうか?
このような理由から、Qt オブジェクトは値ではなく ID として扱われるべきです。ID はコピーや割り当てではなくクローン化され、ID のクローン化は値のコピーや割り当てよりも複雑な操作になります。そのため、QObject と、QObject のすべてのサブクラス(直接または間接)は、copy constructor and assignment operator が無効になっています。
©2024 The Qt Company Ltd. 本書に含まれるドキュメントのコントリビューションの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。