【问题标题】:Q_OBJECT and moc for inheritanceQ_OBJECT 和 moc 用于继承
【发布时间】:2016-03-13 13:43:13
【问题描述】:

我正在一个项目中工作,其中在我需要继承的类中使用了 Q_OBJECT 宏。

已经定义了 Q_OBJECT 的类如下所示,

class cBaseObject : public QObject, public cinformation
{
    Q_OBJECT
    //...
    //...
}

我正在通过 cBaseObject 的公共继承创建一个新类。我是否需要再次编写 Q_OBJECT 宏? 我尝试了使用和不使用该宏,如果我不包含 QT_MACRO,我发现没有生成 moc_XXX.cxx 文件

class cEnhancedbaseObject : public cBaseObject
{
    Q_OBJECT   // if i didn't include this 
          //no moc__XXX.cxx file is  generated
} 

但是当我继承类时为什么 Q_OBJECT 宏的功能也没有被继承。 如果 Q_OBJECT 宏被定义两次,如果它是继承的,有什么问题吗? Q_OBJECT 的行为如何用于多级继承。我已经读过,对于多重继承,应该首先放置 QOBJECT 类。多级继承有什么类似的吗?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    Q_OBJECT 宏的存在标志着该类包含在 Qt 的元对象系统中。如果您希望您的类在此元对象系统中拥有自己的标识,则必须将 Q_OBJECT 宏放入其中(并确保它自然地直接或间接地派生自 QObject)。

    在您的cBaseObjectcEnhancedbaseObject 的情况下,如果cEnhancedbaseObject 不包含Q_OBJECT 宏,它仍然可以正常工作。然而,就 Qt 的元对象系统而言,cEnhancedbaseObject 类型的对象将是元类型cBaseObject。可以看到使用myObject->metaObject()->className()等函数。

    【讨论】:

    • 值得注意的是,可以在没有 Q_OBJECT 的情况下声明槽和信号,但连接它们只会在运行时失败(使用旧式/动态连接时),这是一个令人讨厌的陷阱。一般来说,每个 QObject 子类都应该默认有 Q_OBJECT 宏,除非你真的知道他在做什么。我能想到的没有宏的唯一充分理由是 QObject 派生的基类的模板化子类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多