什么时候应该使用Q_OBJECT?

Jak*_*les 44 c++ qt qobject

文件指出:

该Q_OBJECT宏必须出现在类的定义,声明自己的信号和槽的私人部分或使用通过Qt的元对象系统提供的其他服务.

究竟是什么意思呢?我可以安全地省略哪些QObject派生类?如果你在一个QObject派生类忽略Q_OBJECT会出现的问题,然后从一个继承?基本上我想了解更多关于何时可以从我的Qt课程中省略它的信息.

lia*_*iaK 35

您应该将Q_OBJECT用于派生自的任何非模板化类QObject.

除了信号和槽之外,Q_OBJECT宏还提供与给定类相关联的元对象信息.

文档所述:

我们强烈建议QObject的所有子类使用Q_OBJECT宏,无论它们是否实际使用信号,插槽和属性.

假设我们有以下课程:

class Class : public QObject {
public:
  Class() {}
};
Run Code Online (Sandbox Code Playgroud)

如果没有Q_OBJECT,以下元对象系统功能(以及其他)将不适用于Class:

  1. qobject_cast<Class>() - 由于缺少元数据

  2. QObject::tr() - 由于缺少元数据

  3. Class当按名称调用或查找时,首先声明的槽和invokables - 没有任何QMetaObject方法适用于这些方法,Qt 4也不会connect- 由于缺少元数据

  4. 信号 - 因为moc不会生成他们的实现,代码将无法编译.

当然,您可以省略它,但如果您使用这些功能,则需要记住将宏放入类的声明中.这是一种相当脆弱的做法,最好避免.节省下来是不值得的.所以,不要等待 - 将Q_OBJECT宏添加到源自QObject编码策略的每个类中.

Q_OBJECT宏应该永远在不从派生类使用QObject.要向这些类添加invokable和属性,请改用Q_GADGET宏.

  • 诡异的。首先,您声称对于从“QObject”派生的任何类来说,使用“Q_OBJECT”是“强制的”,只是为了继续引用文档中相反的部分(即它是“可选的”)。请更新您的答案以消除歧义。 (2认同)

Mar*_*ett 6

如果你想使用信号/插槽,你必须包含Q_OBJECT宏并从QObject派生类.

否则你可以把它留下来,但是把它包含在所有Qt gui类中都没有任何害处