gpt4 book ai didi

c++ - 将 QVariant 中的枚举转换为整数

转载 作者:太空狗 更新时间:2023-10-29 21:05:04 27 4
gpt4 key购买 nike

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

但我想要实现的是支持自定义枚举类型,用户必须使用 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 指针并读取它。它有效。

关于c++ - 将 QVariant 中的枚举转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10825453/

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