繁体   English   中英

QMetaType::Float 不在 QVariant::Type 中

[英]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::TypeQVariant::Type )玩弄一些肮脏的技巧。 QVariant::type()上引用 4.8.4 文档:

返回存储在变体中的值的存储类型。 尽管此函数声明为返回QVariant::Type ,但返回值应解释为QMetaType::Type 特别是,只有当值等于或大于QMetaType::User才会在此处返回QVariant::UserType

请注意, QVariant::CharQVariant::RegExpQVariant::FontQVariant::Transform范围内的返回值对应于QMetaType::QCharQMetaType::QRegExpQMetaType::QFontQMetaType::QQuaternion范围内的值QMetaType::QQuaternion

另请注意,类型void*longshortunsigned longunsigned shortunsigned charfloatQObject*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.

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