web-dev-qa-db-ja.com

Q_OBJECTマクロは何をしますか?すべてのQtオブジェクトにこのマクロが必要なのはなぜですか?

私はQtを使い始めたばかりで、すべてのサンプルクラス定義にマクロQ_OBJECT最初の行として。このプリプロセッサマクロの目的は何ですか?

119

Qtドキュメント から:

メタオブジェクトコンパイラであるmocは、QtのC++拡張機能を処理するプログラムです。

Mocツールは、C++ヘッダーファイルを読み取ります。 Q_OBJECTマクロを含む1つ以上のクラス宣言を見つけると、それらのクラスのメタオブジェクトコードを含むC++ソースファイルを生成します。とりわけ、信号とスロットのメカニズム、ランタイム型情報、および動的プロパティシステムにはメタオブジェクトコードが必要です。

126
Stu Mackellar

このクラスにはgui要素があり、シグナル/スロットメカニズムを使用するクラスに追加する必要がある 'moc'を介して実行する必要があることをプリコンパイラに伝えるだけです。
しかし、他のクラスでは静かに無視されます-ビルド時間を増やすだけです。

16
Martin Beckett

MOC(メタオブジェクトコンパイラ)は、ヘッダーファイルに含まれるQ_OBJECTマクロをC++の同等のソースコードに変換します。基本的にシグナルスロットメカニズムを制御し、C++コンパイラが理解できるようにします。

8
aditya

1メタオブジェクトシステムのQtドキュメントから

MocツールはC++ソースファイルを読み取ります。 Q_OBJECTマクロを含む1つ以上のクラス宣言を見つけると、それらのクラスのそれぞれのメタオブジェクトコードを含む別のC++ソースファイルを生成します。この生成されたソースファイルは、クラスのソースファイルに#include'dされるか、通常はコンパイルされてクラスの実装にリンクされます。

2THE Q_OBJECTのQtドキュメントから

Q_OBJECTマクロは、独自のシグナルとスロットを宣言するか、Qtのメタオブジェクトシステムによって提供される他のサービスを使用するクラス定義のプライベートセクションに表示する必要があります。

3mocのQtドキュメントから

Mocツールは、C++ヘッダーファイルを読み取ります。 Q_OBJECTマクロを含む1つ以上のクラス宣言を見つけると、それらのクラスのメタオブジェクトコードを含むC++ソースファイルを生成します。とりわけ、信号とスロットのメカニズム、実行時の型情報、および動的プロパティシステムにはメタオブジェクトコードが必要です。

4Signals and SlotsのQtドキュメントから

Q_OBJECTマクロはプリプロセッサによって展開され、mocによって実装されるいくつかのメンバー関数を宣言します。 「LcdNumberのvtableへの未定義参照」の行に沿ってコンパイラエラーが発生した場合、mocを実行するか、linkコマンドにmoc出力を含めるのを忘れている可能性があります。

4
Bob Zhang

Q_OBJECTマクロは、独自の信号とスロットを宣言するか、Qtのメタオブジェクトシステムによって提供される他のサービスを使用するクラス定義のプライベートセクションに表示する必要があります。

0
Andres