から派生したテンプレート化されていないクラスにQ_OBJECT
はマクロを使用する必要があります。QObject
シグナルとスロットに加えて、Q_OBJECT
マクロは、特定のクラスに関連付けられているメタ オブジェクト情報を提供します。
ドキュメントに記載されているように:
実際にシグナル、スロット、およびプロパティを使用するかどうかに関係なく、QObject のすべてのサブクラスで Q_OBJECT マクロを使用することを強くお勧めします。
次のクラスがあるとします。
class Class : public QObject {
public:
Class() {}
};
がないQ_OBJECT
と、次のメタオブジェクト システム機能 (特に) は では機能しませんClass
。
qobject_cast<Class>()
- メタデータが欠落しているため
QObject::tr()
- メタデータが欠落しているため
で最初に宣言されたスロットと invokables はClass
、呼び出されるか、名前で検索されたときに、メタデータが欠落しているQMetaObject
ため、これらのメソッドに対して機能するメソッドはなく、Qt 4 も機能しませんconnect
シグナル -moc
実装が生成されず、コードがコンパイルされないため。
もちろん省略できますが、これらの機能を使用する場合は、マクロをクラスの宣言に入れることを忘れないでください。これはかなり壊れやすい慣行であり、避けるのが最善です。節約は割に合わない。待ってはいけません -コーディング ポリシーの問題として、Q_OBJECT
派生元のすべてのクラスにマクロを追加してください。QObject
Q_OBJECT
マクロは、から派生していないクラスでは決してQObject
使用しないでください。このようなクラスに呼び出し可能オブジェクトとプロパティを追加するには、Q_GADGET
代わりにマクロを使用します。