代码之家  ›  专栏  ›  技术社区  ›  Jake Petroules

什么时候应该使用qu对象?

  •  43
  • Jake Petroules  · 技术社区  · 16 年前

    文件规定:

    qu OBJECT宏必须出现在 类定义的私有部分 使用其他服务的插槽或 由Qt的元对象系统提供。

    但是 确切地

    4 回复  |  直到 13 年前
        1
  •  41
  •   cgmb    10 年前

    你应该使用 Q_OBJECT 宏 对于从 QObject .

    除了信号和插槽之外 Q\ U对象 宏提供 元对象信息 与给定类关联的。

    如中所述 the documentation

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

    假设我们有以下类:

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

    没有 Q\ U对象 ,以下元对象系统功能(以及其他功能)将不适用于 Class :

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

    2. QObject::tr()

    3. 插槽和可调用项首先在中声明 ,当调用或按名称查找时-无 QMetaObject 方法适用于这些方法,qt4也不适用 connect

    4. 信号-自 moc 不会生成它们的实现,代码也不会编译。

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

    这个 Q\ U对象 从未 Q对象 . 要向此类类添加可调用项和属性,请使用 Q_GADGET 而不是宏。

        2
  •  5
  •   Martin Beckett    16 年前

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

    否则您可以忽略它,但将它包含在所有Qt gui类中并没有任何坏处

        3
  •  4
  •   CHW mmoment    10 年前

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

    http://doc.qt.io/archives/4.6/metaobjects.html

    我认为底线是,如果您从QObject层次结构继承,那么不管怎样,都要抛出qu OBJECT宏。这是简单的,并将挽救你从一些潜在的困惑问题的道路。

        4
  •  2
  •   CHW mmoment    10 年前

    应该 在从QObject派生的任何类中始终使用Q\u OBJECT宏。

    有一件事我没看到,如果你 不要 明确地把 宏,然后使用 非常方便 qobject_cast