このページでは

オブジェクトモデル

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

Qtは、C++に以下の機能を追加します:

これらの Qt 機能の多くは、QObject からの継承に基づいた標準的な C++ の手法で実装されています。一方、オブジェクト通信メカニズムや動的プロパティシステムなど、その他の機能には、Qt 独自のMeta-Object Compiler (moc)が提供するメタオブジェクトシステムが必要です。

メタオブジェクトシステムは、C++を真のコンポーネント型GUIプログラミングにより適したものにするためのC++の拡張機能です。

重要なクラス

これらのクラスは、Qt オブジェクトモデルの基礎を成しています。

QMetaAssociation

連想コンテナへの型消去アクセスを可能にする

QMetaClassInfo

クラスに関する追加情報

QMetaContainer

順次コンテナおよび連想コンテナに共通する機能

QMetaEnum

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

QMetaMethod

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

QMetaObject

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

QMetaProperty

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

QMetaSequence

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

QMetaType

メタオブジェクトシステム内で名前付き型を管理する

QObject

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

QObjectCleanupHandler

複数の QObject のライフサイクルを監視する

QPointer

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

QSignalBlocker

QObject::blockSignals() を囲む、例外安全なラッパー

QSignalMapper

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

QVariant

最も一般的なQtデータ型に対するユニオンのように振る舞う

Qtオブジェクト:アイデンティティ対値

上記で挙げたQtオブジェクトモデルの追加機能の一部では、Qtオブジェクトを「値」ではなく「アイデンティティ」として捉える必要があります。 値はコピーまたは代入されますが、アイデンティティはクローンされます。クローンとは、古いものの完全なコピーではなく、新しいアイデンティティを作成することを意味します。例えば、双子にはそれぞれ異なるアイデンティティがあります。見た目は同じでも、名前も場所も異なり、ソーシャルネットワークも全く異なる場合があります。

したがって、アイデンティティのクローン作成は、値のコピーや代入よりも複雑な操作となります。これが何を意味するのかは、Qtオブジェクトモデルを見れば理解できます。

Qtオブジェクトは……

  • には一意のQObject::objectName()が割り当てられている場合があります。Qtオブジェクトをコピーする場合、そのコピーにはどのような名前を付けるべきでしょうか?
  • オブジェクト階層内の特定の位置を占めています。Qtオブジェクトをコピーする場合、そのコピーはどの位置に配置されるべきでしょうか?
  • 他の Qt オブジェクトに接続され、それらに対してシグナルを送信したり、それらから送信されたシグナルを受信したりすることができます。Qt オブジェクトをコピーする場合、これらの接続をコピー先にどのように引き継ぐべきでしょうか?
  • 実行時に、C++クラスで宣言されていない新しいプロパティが追加されることがあります。Qtオブジェクトをコピーする場合、コピーにはオリジナルに追加されたプロパティを含めるべきでしょうか?

これらの理由から、Qtオブジェクトは「値」ではなく「アイデンティティ」として扱う必要があります。アイデンティティは「複製」されるものであり、「コピー」や「代入」されるものではありません。また、アイデンティティの複製は、値のコピーや代入よりも複雑な操作です。そのため、QObject およびQObject のすべてのサブクラス(直接的または間接的)では、copy constructor and assignment operator が無効化されています。

© 2026 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.