文件指出:
该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
:
qobject_cast<Class>()
- 由于缺少元数据
QObject::tr()
- 由于缺少元数据
Class
当按名称调用或查找时,首先声明的槽和invokables - 没有任何QMetaObject
方法适用于这些方法,Qt 4也不会connect
- 由于缺少元数据
信号 - 因为moc
不会生成他们的实现,代码将无法编译.
当然,您可以省略它,但如果您使用这些功能,则需要记住将宏放入类的声明中.这是一种相当脆弱的做法,最好避免.节省下来是不值得的.所以,不要等待 - 将Q_OBJECT
宏添加到源自QObject
编码策略的每个类中.
该Q_OBJECT
宏应该永远在不从派生类使用QObject
.要向这些类添加invokable和属性,请改用Q_GADGET
宏.