[英]Deserializing QByteArray with known QMetaType::Type into QVariant
[英]QMetaType::Float not in QVariant::Type
我有一个运行良好的应用程序,但它没有在打开警告的情况下编译。 我正在尝试将其重新打开并将它们整理出来,但没有关于如何解决此问题的想法。 我有 :
QVariant someVar
QVariant::Type variantType = someVar.type();
switch (variantType) {
case QMetaType::QString:
doSomething1();
break;
case QMetaType::Float:
doSomething2();
break;
}
并收到此警告/错误:
error: case value ‘135’ not in enumerated type ‘QVariant::Type’ [-Werror=switch]
在 QMetaType::Float 行中。 我检查了 QT 文档,它把 QMetaType::Float 列为值 38。可能是什么原因造成的?
我能找到的最接近的东西是在https://github.com/qbittorrent/qBittorrent/issues/2510有同样的错误。 有没有人遇到过这个?
Qt 使用这两个枚举( QMetaType::Type
和QVariant::Type
)玩弄一些肮脏的技巧。 在QVariant::type()
上引用 4.8.4 文档:
返回存储在变体中的值的存储类型。 尽管此函数声明为返回
QVariant::Type
,但返回值应解释为QMetaType::Type
。 特别是,只有当值等于或大于QMetaType::User
才会在此处返回QVariant::UserType
。请注意,
QVariant::Char
到QVariant::RegExp
和QVariant::Font
到QVariant::Transform
范围内的返回值对应于QMetaType::QChar
到QMetaType::QRegExp
和QMetaType::QFont
到QMetaType::QQuaternion
范围内的值QMetaType::QQuaternion
。另请注意,类型
void*
、long
、short
、unsigned long
、unsigned short
、unsigned char
、float
、QObject*
和QWidget*
在QMetaType::Type
中表示但不在QVariant::Type
,它们可以通过这个功能。 但是,当针对QVariant::Type
进行测试时,它们被认为是用户定义的类型。
换句话说,函数QVariant::type()
返回QMetaType::Type
类型为QVariant::Type
,并且这两个枚举共享很多(但不是全部)它们的枚举器。 这使得在严格的类型系统中处理它们变得困难——它们基本上是摇摆不定的 typey-wypey 东西。
在您的情况下,请注意枚举器QMetaType::Float
是在QVariant::Type
没有直接等效项的枚举器之一。
我会说消除警告的最佳方法是将variantType
更改为QMetaType::Type
,可能会在初始化时进行variantType
转换和/或在必要时引用 Qt 文档的注释。
只需打开QMetaType::Type
。 这样做是有效的,因为QVariant::type()
的含义是QMetaType::Type
的含义,尽管返回类型是QVariant::Type
。 这是您必须解决的 API 怪癖/错误:
QVariant variant = ...;
switch (static_cast<QMetaType::Type>(variant.type())) {
...
}
怪癖的原因完全是历史性的。 QVariant::type()
返回一个“错误”的类型,只是为了在 Qt 5 系列中保持二进制兼容性。 在 Qt 6 中,IIRC QVariant::Type
只是QMetaType::Type
的别名(也可能是一个已弃用的别名)。
QVariant::Type
不包含名为Float
的条目(请参阅qvariant.h )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.