为什么q_enum在没有qregistermetatepe的情况下无法获得正确的类型值
why q_enum unable to get correct type value without qRegisterMetaType?
我有一个带有多个DLL的QT项目。
dlls:a,b,c
A取决于B和C。而B和C没有任何依赖性。
b导出自定义类B_custom。B_custom类是从qobject派生的。
dll a:
Class Exported A : public C
{
...
Q_PROPERTY(B_Custom:B_Enum b_enum READ GetBEnum WRITE SetBEnum NOTIFY BEnumChanged);
void DoSomething()
{
SomethingElse("b_enum");
}
....
}
dll b:
class Exported B_Custom: public QObject
{
Q_OBJECT;
public:
enum B_Enum {
...
};
Q_ENUM(B_Enum);
...
}
dll c:
Class C : public QObject
{
virtual void SomethingElse(const QByteArray &propName)
{
auto type = property(propName).userType();
}
}
主要:
A * a = new A();
a->DoSomething();
问题是针对C类,函数的类型值something sometherse是qmetatype :: unknowntype。
但是,如果我在
中手动注册b_enumqRegisterMetaType<B_Custom::B_Enum>()
在致电a :: dosomething((之前,函数的类型值某物不会是qmetatype :: unknowntype。
它将返回正确的类型值,例如1230,用于输入函数c。
的函数某物但要累积到qt文档@http://doc.qt.io/qt-5/qobject.html#q_enum,
用q_enum声明的枚举将其qmetaenum注册在封闭的qmetaObject中。您也可以使用qmetaenum :: fromType((获取qmetaenum。
注册的枚举也会自动注册到QT Meta类型系统,使其成为Qmetatype已知的,而无需使用q_declare_metatype((。
那么,为什么我需要调用qregistermetatype((才能让键入C类的theSingse函数获取正确的类型值?
dll b中有很多类似类型,需要在c。
中获取类型信息如果我需要使用qregistermetatype一一注册这些类型,那确实不是一个乐趣。
仔细查看以下文档:
"此外,必须在使用Qobject :: property((api,qregisterMetatype((之前使用T型T型,必须在使用之前,通常在使用T的类构造函数中(函数。"
http://doc.qt.io/qt-5/qmetatype.html#qregistermetatype-1。
现在回到您的代码:
您在B_Custom
类中声明了Q_ENUM(B_Enum);
。
但是该 enum
的属性在class A
中声明。
现在再次回顾上面指定的文档语句。
因此,要将enum
与class A
中声明的CC_5一起使用,您是否必须在使用class A
构造函数中或在使用它之前在MAIM函数中注册META类型(您使用过并使用(。
更多您可能会疑问,为什么我们需要在另一个类别中再次注册。
查看以下语句:似乎您必须在所有类型中,无论您使用的地方,不仅在您声明的类中注册类型。
。"如果在另一个类中声明了枚举类型,则需要其完全合格的名称(即其他class ::优先级(,并且其他类也必须继承Qobject并使用此处注册枚举类型q_enum((宏。" (http://doc.qt.io/qt-5/properties.html(
- 为什么在这种情况下,bool 类型的输出等于 0?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 如何在没有实例的情况下获取非静态方法的类型?
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 是否可以在不使用 decltype 的情况下推断先前定义的 extern 变量的类型
- 在没有标识符的情况下如何读取复杂的C++类型声明?
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 如何在不给它任何类型(如整数)的情况下定义某物?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 将类型映射到整数值后,如何在给定整数值的情况下恢复类型?
- 如何在不违反类型别名规则的情况下解释消息负载?
- msgpack:在不知道类型的情况下解包自定义类
- 对于多态类型T,如何在没有类型T实例的情况下获得指向T的虚拟表的指针
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 为什么在以下情况下不需要为依赖类型使用typename
- 有没有办法在没有reinterpret_cast的情况下保存多种类型的指针?
- 如何定义可以在没有联合的情况下容纳uintptr_t或uint32_t的类型?
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?