gpt4 book ai didi

c++ - 什么时候应该使用 Q_OBJECT?

转载 作者:IT老高 更新时间:2023-10-28 14:00:29 27 4
gpt4 key购买 nike

文档指出:

The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.

但是正是这是什么意思?在哪些 QObject 派生类上我可以安全地省略它?如果在 QObject 派生类上省略 Q_OBJECT,然后从该类继承,会出现问题吗?基本上,我想了解更多关于何时可以从 Qt 类(class)中省略它的信息。

最佳答案

您应该使用 Q_OBJECT用于派生自 QObject 的任何非模板类

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

the documentation 中所述:

we strongly recommend that all subclasses of QObject use the Q_OBJECT macro regardless of whether or not they actually use signals, slots, and properties.

假设我们有以下类:

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而是宏。

关于c++ - 什么时候应该使用 Q_OBJECT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689714/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com