繁体   English   中英

将QVariant中的枚举转换为整数

[英]Convert enums in QVariant into integers

我写了一个使用Qt元类型系统的库。 我的库的用户可以提供包含在QVariant中的自定义类型的值。 稍后在库中的一些代码中,我需要序列化这个QVariant。 我为几种类型实现了序列化器,我真的不需要支持Qt元类型系统已知的每种类型。 我将这些值序列化,以便使用JSON通过网络发送它们。

但我想要实现的是支持自定义枚举类型,用户必须使用qtRegisterMetaType<MyEnum>("MyEnum");注册到元类型系统qtRegisterMetaType<MyEnum>("MyEnum"); 无论如何。 我想通过将它转换为整数类型来序列化这样的枚举。

我在这样的枚举值上尝试了QVariant::value<int>() ,但它总是返回0. QVariant::canConvert<int>()返回false。

是否有可能(可能使用一些脏黑客)获取包装枚举的整数值? Qt如何处理元类型系统中的枚举值? 也许当我确定这是我在这里的枚举值时,我可以访问原始的void*指针。

这引出了下一个问题: 如何检查Qt元类型是否完全是用户枚举类型?

请注意,因为我正在编写库的内部代码,所以我不能使用模板。 我唯一的“东西”是QVariant,没有编译时类型信息。

// code in the project using my library:
MyEnum foo;
libraryFunction(foo);
// internal library code (note that compile-time type info isn't available):
QVariant foo = getValueAsVariant(...);
if (/* how to check if foo is an enum type? */)
    int enumValue = foo.value<int>(); // not working for enums!

我知道C ++编译器可以选择在内部使用任何整数类型(不仅仅是32位)来存储枚举值。 这对我来说可能是个问题吗? (例如,如果我将void*重新解释为int* 。但请记住, void*数据是由QVariant本身分配的,因此它可能为sizeof == 2的枚举分配超过2个字节。)

脏的hack是将QVariant序列化为QDataStream,然后将最后4个字节反序列化为int。 这不回答如何检查枚举类型的问题。 我将深入研究moc输出并更新它。

Leemes帮助发现QMetaObject::enumerator()将为您提供类中定义的所有元枚举。 这足以检查给定的类型名称是否为枚举,因为可以使用QMetaType::type()将枚举名称转换为类型ID(但是可以在类名和“::”之前添加)。 为了从保存枚举的QVariant转换为int,只需将QVariant::constData()重新解释为int指针并读取它。 有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM