[英]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
:
qobject_cast<Class>()
- 由于缺少元数据
QObject::tr()
- 由于缺少元数据
slot 和 invokables 首先在Class
声明,当按名称调用或查找时 - QMetaObject
方法都不适用于这些方法,Qt 4 也不会connect
- 由于缺少元数据
信号 - 因为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.