私はQtを使い始めたばかりで、すべてのサンプルクラス定義にマクロQ_OBJECT
最初の行として。このプリプロセッサマクロの目的は何ですか?
Qtドキュメント から:
メタオブジェクトコンパイラであるmocは、QtのC++拡張機能を処理するプログラムです。
Mocツールは、C++ヘッダーファイルを読み取ります。 Q_OBJECTマクロを含む1つ以上のクラス宣言を見つけると、それらのクラスのメタオブジェクトコードを含むC++ソースファイルを生成します。とりわけ、信号とスロットのメカニズム、ランタイム型情報、および動的プロパティシステムにはメタオブジェクトコードが必要です。
このクラスにはgui要素があり、シグナル/スロットメカニズムを使用するクラスに追加する必要がある 'moc'を介して実行する必要があることをプリコンパイラに伝えるだけです。
しかし、他のクラスでは静かに無視されます-ビルド時間を増やすだけです。
MOC(メタオブジェクトコンパイラ)は、ヘッダーファイルに含まれるQ_OBJECTマクロをC++の同等のソースコードに変換します。基本的にシグナルスロットメカニズムを制御し、C++コンパイラが理解できるようにします。
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出力を含めるのを忘れている可能性があります。
Q_OBJECTマクロは、独自の信号とスロットを宣言するか、Qtのメタオブジェクトシステムによって提供される他のサービスを使用するクラス定義のプライベートセクションに表示する必要があります。