文件指出:
Q_OBJECT宏必须出现在类定义的私有部分,该类定义声明自己的信号和时隙,或者使用Qt的元对象系统提供的其他服务。
但这到底是什么意思?在哪个QObject派生类上,我可以安全地省略它?如果您忽略QObject派生类上的Q_OBJECT,然后继承该类,那么会出现问题吗?基本上,我想要更多关于何时可以从Qt类中省略它的信息。
发布于 2010-09-11 04:34:22
对于从QObject.派生的任何非模板类,都应该使用Q_OBJECT宏。
除了信号和插槽,Q_OBJECT宏还提供与给定类相关联的元对象信息。
如文献资料中所述
我们强烈建议 QObject的所有子类都使用Q_OBJECT宏,不管它们是否实际使用信号、插槽和属性。
假设我们有以下类:
class Class : public QObject {
public:
Class() {}
};如果没有Q_OBJECT,下面的元对象系统特性(以及其他特性)将不适用于Class
qobject_cast<Class>() -由于缺少元数据QObject::tr() -由于缺少元数据Class中首先声明的插槽和可调用对象,当调用或按名称查找时,由于缺少元数据,没有任何QMetaObject方法对这些方法起作用,Qt 4 connect也不起作用。moc不会生成它们的实现,代码也不会编译。当然,您可以省略它,但是如果您曾经使用过这些特性,则需要记住将宏放入类的声明中。这是一种相当脆弱的做法,最好避免。节省下来的钱不值得。因此,不要等待--将Q_OBJECT宏添加到从QObject派生的每个类中,作为编码策略的问题。
Q_OBJECT宏不应用于不从QObject派生的类。若要向此类类添加可调用项和属性,请改用Q_GADGET宏。
发布于 2010-09-11 03:51:20
如果要使用信号/插槽,则必须包含Q_OBJECT宏并从QObject派生该类。
否则,您可以忽略它,但将其包含在所有Qt类中并不会有任何害处。
发布于 2010-09-11 04:30:13
嗯,第一部分很清楚,你可能已经知道了。信号和插槽,元对象系统的其余部分鲜为人知。也许更有用的特性之一是动态属性。虽然它们有很多用途,但我使用它们来利用Qt的动画系统QPropertyAnimation。
这里有更多关于元对象系统的信息:http://doc.qt.io/archives/4.6/metaobjects.html。
我认为底线是,如果您继承了QObject层次结构,那么不管如何,都要添加Q_OBJECT宏。这很容易做到,并将从一些潜在的令人困惑的问题的道路上拯救你。
https://stackoverflow.com/questions/3689714
复制相似问题