53

ドキュメントには次のように記載されています。

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

しかし、それは正確にはどういう意味ですか?どの QObject 派生クラスで安全に省略できますか? QObject 派生クラスで Q_OBJECT を省略し、そのクラスから継承すると問題が発生しますか? 基本的に、いつQtクラスから省略できるかについてもう少し情報が欲しいです。

4

4 に答える 4

42

から派生したテンプレート化されていないクラスにQ_OBJECTはマクロを使用する必要があります。QObject

シグナルとスロットに加えて、Q_OBJECTマクロは、特定のクラスに関連付けられているメタ オブジェクト情報を提供します。

ドキュメントに記載されているように:

実際にシグナル、スロット、およびプロパティを使用するかどうかに関係なく、QObject のすべてのサブクラスで Q_OBJECT マクロを使用することを強くお勧めします。

次のクラスがあるとします。

class Class : public QObject {
public:
  Class() {}
};

がないQ_OBJECTと、次のメタオブジェクト システム機能 (特に) は では機能しませんClass

  1. qobject_cast<Class>()- メタデータが欠落しているため

  2. QObject::tr()- メタデータが欠落しているため

  3. で最初に宣言されたスロットと invokables はClass、呼び出されるか、名前で検索されたときに、メタデータが欠落しているQMetaObjectため、これらのメソッドに対して機能するメソッドはなく、Qt 4 も機能しませんconnect

  4. シグナル -moc実装が生成されず、コードがコンパイルされないため。

もちろん省略できますが、これらの機能を使用する場合は、マクロをクラスの宣言に入れることを忘れないでください。これはかなり壊れやすい慣行であり、避けるのが最善です。節約は割に合わない。待ってはいけません -コーディング ポリシーの問題として、Q_OBJECT派生元のすべてのクラスにマクロを追加してください。QObject

Q_OBJECTマクロは、から派生していないクラスでは決してQObject使用しないでください。このようなクラスに呼び出し可能オブジェクトとプロパティを追加するには、Q_GADGET代わりにマクロを使用します。

于 2010-09-11T04:34:22.690 に答える
5

シグナル/スロットを使用する場合は、Q_OBJECT マクロを含めて、QObject からクラスを派生させる必要があります。

それ以外の場合は省略できますが、すべての Qt gui クラスに含めても害はありません。

于 2010-09-11T03:51:20.447 に答える
4

最初の部分は、おそらくすでにご存知のとおり、かなり明確です.シグナルとスロット、残りのメタオブジェクト システムはあまり知られていません。おそらく、より便利な機能の 1 つは動的プロパティです。これらには多くの用途がありますが、Qt のアニメーション システムを利用するために使用しましたQPropertyAnimation

ここにメタオブジェクト システムに関するもう少し詳しい情報があります: http://doc.qt.io/archives/4.6/metaobjects.html

肝心なのは、QObject階層から継承する場合、関係なくQ_OBJECTマクロをスローすることだと思います。これは簡単に行うことができ、将来的に困惑する可能性のある問題からあなたを救います。

于 2010-09-11T04:30:13.693 に答える
2

@liaKが言ったことは正しいです(つまり、QObjectから派生するクラスでは常にQ_OBJECTマクロを使用する必要があります)。

私が強調表示されていないことの1つは、 Q_OBJECTマクロを明示的に配置しないと、非常に便利なqobject_castを使用しても機能しないことです。

于 2010-09-11T15:40:52.223 に答える