首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候应该使用Q_OBJECT?

什么时候应该使用Q_OBJECT?
EN

Stack Overflow用户
提问于 2010-09-11 03:39:04
回答 4查看 27.5K关注 0票数 54

文件指出:

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

但这到底是什么意思?在哪个QObject派生类上,我可以安全地省略它?如果您忽略QObject派生类上的Q_OBJECT,然后继承该类,那么会出现问题吗?基本上,我想要更多关于何时可以从Qt类中省略它的信息。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-11 04:34:22

对于从QObject.派生的任何非模板类,都应该使用Q_OBJECT

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

文献资料中所述

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

假设我们有以下类:

代码语言:javascript
复制
class Class : public QObject {
public:
  Class() {}
};

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

  1. qobject_cast<Class>() -由于缺少元数据
  2. QObject::tr() -由于缺少元数据
  3. Class中首先声明的插槽和可调用对象,当调用或按名称查找时,由于缺少元数据,没有任何QMetaObject方法对这些方法起作用,Qt 4 connect也不起作用。
  4. 信号--因为moc不会生成它们的实现,代码也不会编译。

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

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

票数 43
EN

Stack Overflow用户

发布于 2010-09-11 03:51:20

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

否则,您可以忽略它,但将其包含在所有Qt类中并不会有任何害处。

票数 5
EN

Stack Overflow用户

发布于 2010-09-11 04:30:13

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

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

我认为底线是,如果您继承了QObject层次结构,那么不管如何,都要添加Q_OBJECT宏。这很容易做到,并将从一些潜在的令人困惑的问题的道路上拯救你。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3689714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档