我有一个运行良好的应用程序,但未在打开警告的情况下进行编译。我正在尝试重新打开它并对其进行排序,但是关于如何解决此问题的想法已用尽。我有 :

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::TypeQVariant::Type的值,并且这两个枚举共享很多(但不是全部)枚举。这使得在严格类型系统中与它们打交道变得很困难-它们基本上是摇摆不定的,打字过的,摇摆不定的东西。
在您的情况下,请注意,枚举器QMetaType::Float是在QVariant::Type中没有直接等效项的枚举器。
我想说,使警告静音的最佳方法是将variantType更改为QMetaType::Type,可能在初始化时进行强制转换和/或在必要时引用Qt docs的注释。

关于c++ - QMetaType::Float不在QVariant::Type中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31290606/

10-11 18:09