繁体   English   中英

什么时候应该使用 Q_OBJECT?

[英]When should Q_OBJECT be used?

该文件指出:

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

但这究竟是什么意思? 在哪些 QObject 派生类上我可以安全地省略它? 如果在 QObject 派生类上省略 Q_OBJECT,然后从该类继承,会出现问题吗? 基本上,我想了解更多有关何时可以从 Qt 类中省略它的信息。

对于从QObject派生的任何非模板化类,您应该使用Q_OBJECT宏。

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

文档所述

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

假设我们有以下类:

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

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

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

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

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

  4. 信号 - 因为moc不会生成它们的实现并且代码不会编译。

当然,您可以省略它,但是如果您曾经使用过这些功能,则需要记住将宏放入类的声明中。 这是一种相当脆弱的做法,最好避免。 节省的钱不值得。 所以,不要等待 - 将Q_OBJECT宏添加到从QObject派生的每个类中,作为编码策略的问题。

Q_OBJECT应用于不是从QObject派生的类。 要将可调用项和属性添加到此类类,请改用Q_GADGET宏。

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

否则,您可以将其排除在外,但将其包含在所有 Qt gui 类中不会造成任何伤害

嗯,第一部分很清楚,因为您可能已经知道了..信号和插槽,元对象系统的其余部分鲜为人知。 也许更有用的功能之一是动态属性。 虽然这些有很多用途,但我使用它们来利用 Qt 的动画系统QPropertyAnimation

这里有更多关于元对象系统的信息: http : //doc.qt.io/archives/4.6/metaobjects.html

我认为底线是,如果您从 QObject 层次结构继承,则无论如何都要放入 Q_OBJECT 宏。 这很容易做到,并且可以避免一些潜在的令人困惑的问题。

@liaK 所说的是正确的(简而言之:您应该始终在从 QObject 派生的任何类中使用 Q_OBJECT 宏)。

我没有看到强调的一件事是,如果您没有明确放置Q_OBJECT宏,那么使用有时非常方便的qobject_cast将不起作用!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM