オブジェクトモデル

標準C++オブジェクト・モデルは、オブジェクト・パラダイムに対して非常に効率的なランタイム・サポートを提供する。しかし、その静的な性質は、特定の問題領域では柔軟性に欠ける。グラフィカル・ユーザー・インターフェイス・プログラミングは、実行時の効率と高い柔軟性の両方を必要とする領域です。Qtは、C++のスピードとQtオブジェクトモデルの柔軟性を組み合わせることで、これを提供します。

QtはC++にこれらの機能を追加している:

これらの Qt 機能の多くは、QObject からの継承に基づく、標準的な C++ テクニックで実装されています。その他、オブジェクト通信メカニズムやダイナミック・プロパティ・システムなどは、Qt独自のメタ・オブジェクト・コンパイラ(moc)が提供するメタ・オブジェクト・システムを必要とします。

メタ・オブジェクト・システムはC++の拡張で、真のコンポーネントGUIプログラミングに適した言語です。

重要なクラス

これらのクラスは Qt オブジェクトモデルの基礎となります。

QMetaClassInfo

クラスに関する追加情報

QMetaContainer

シーケンシャル・コンテナと連想コンテナの共通機能

QMetaEnum

列挙子に関するメタデータ

QMetaMethod

メンバ関数に関するメタデータ

QMetaObject

Qt オブジェクトに関するメタ情報

QMetaProperty

プロパティに関するメタデータ

QMetaSequence

シーケンシャル・コンテナへの型消去アクセスを許可する

QMetaType

メタ・オブジェクト・システムにおける名前付き型の管理

QObject

すべての Qt オブジェクトの基底クラス

QObjectCleanupHandler

複数の QObject のライフタイムを監視します。

QPointer

QObject へのガード付きポインタを提供するテンプレート・クラス。

QSignalBlocker

QObject::blockSignals() の例外安全ラッパー。

QSignalMapper

識別可能な送信者からのシグナルを束ねる

QVariant

最も一般的な 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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。