qt中,父类中有Q_OBJECT,子类中还需要加Q_OBJECT吗
在 Qt 中,关于子类是否需要添加 Q_OBJECT 宏的标题,可以总结如下:1. 需要添加 Q_OBJECT 的情况
如果子类满足以下任一条件,必须显式添加 Q_OBJECT 宏:
[*]界说了新的信号或槽:即使父类已有 Q_OBJECT,子类新增的信号/槽需要 moc 处理。
[*]利用了 Qt 的属性体系(Q_PROPERTY):需要元对象体系支持。
[*]需要运行时范例信息(qobject_cast 或 dynamic_cast):依靠元对象的范例辨认。
2. 不需要添加 Q_OBJECT 的情况
如果子类仅满足以下条件,可以省略:
[*]仅继承父类的信号/槽:未新增信号/槽或属性。
[*]仅复用父类功能:如平常方法调用,无需元对象扩展。
3. 示例代码
// 父类(有 Q_OBJECT)
class Parent : public QObject {
Q_OBJECT
public slots:
void parentSlot() {}
};
// 子类需要新增信号/槽,必须加 Q_OBJECT
class Child : public Parent {
Q_OBJECT
public slots:
void childSlot() {} // 新增槽
};
// 子类仅继承,无需 Q_OBJECT
class PassiveChild : public Parent {
// 无 Q_OBJECT(未新增信号/槽/属性)
};
4. 注意事项
[*]编译错误:若漏掉必需的 Q_OBJECT,会报错如 undefined reference to vtable。
[*]qmake 重新运行:修改 Q_OBJECT 后需重新执行 qmake 以更新 moc 生成的代码。
[*]Qt 4.8.6 的稳定性:此版本较旧,建议验证复杂继承下的行为。
结论
需要根据子类的实际用途决定。若扩展了元对象体系功能(信号/槽/属性),则必须添加;否则可省略。为保持代码清晰,即使暂时不需要,显式添加 Q_OBJECT 也无害。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]