Nil*_*ils 2 c++ enums qt qmetaobject qmetatype
我想使用Qt的反射机制,因为C++缺乏这个功能.它似乎工作,但调用所有的宏和辅助函数是非常繁琐的.例如,要将枚举注册为正确的元类型,我必须完成以下所有步骤:
Q_GADGET宏的包装类中声明一个枚举.Q_ENUM之后使用宏注册枚举.Q_DECLARE_METATYPE(MyClass) qRegisterMetaType<..>()包装类的类型和每个声明的枚举.现在我知道如果不需要部分完整功能,可以省略某些步骤.但这不是我想要的,我需要在信号中使用枚举,我需要能够获得信号的元方法并查询它的参数类型.
但我仍然不禁想到必须有更好/更简单的方法来做到这一点.
不幸的是,你做不到这一点.
Q_GADGET(或者Q_OBJECT,对于QObject子类)意味着"为该类生成元对象信息".Q_ENUM表示"为此特定枚举生成元枚举信息".现在有人可能会争辩说,注册类中的所有(公共?)枚举也应该自动注册.但由于这有成本(二进制大小),并且我们使用C++,我们不想为我们永远不会在元对象系统中使用的枚举付费,所以它是选择加入的.Q_DECLARE_METATYPE(如果你正在使用enum本身Q_ENUM不需要;在你的场景中通常不需要)允许在QVariants中使用类型(Qt的C++ 98,C++ 17的无RTTI版本std::any).您是否想要这个取决于类型.我会说所有"价值类型"应该拥有它,但同样,这会生成您可能不想支付的额外代码.此外,这实际上仅适用于"值类型" - 此注册要求类型具有公共默认构造函数,公共复制构造函数,公共复制赋值,公共析构函数.如果你有一个没有这些的类,你不能使用这个宏=>你不能把它包装成一个QVariant.qRegisterMetaType 在运行时在表中注册上述构造函数/析构函数,使您可以为该类型设置唯一ID(如果要在方法签名中标识类型,则需要),动态创建或销毁该类型的实例(必要时,除其他外,实现排队连接:Qt需要一种通用方法将信号的参数复制到要发送到目标线程的事件中,并在以后销毁这些参数,使用Q_PROPERTY子系统.根据您需要做什么,您需要所有这些的子集.
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |