我有一个应用程序运行良好,但它没有编译与警告打开。我试着把它打开,把它们分类,但是没有解决这个问题的想法。我有:
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,它有同样的错误。以前有人遇到过这种事吗?
发布于 2015-07-08 11:54:59
在没有这两个枚举(QMetaType::Type和QVariant::Type)的情况下,Qt会玩一些肮脏的把戏。引用QVariant::type()上的4.8.4文档
返回存储在变体中的值的存储类型。尽管此函数被声明为返回
QVariant::Type,但返回值应解释为QMetaType::Type。特别是,只有当值等于或大于QMetaType::User时,才会在这里返回QMetaType::User。 请注意,范围中的值--QVariant::Char通过QVariant::RegExp返回,QVariant::Font通过QVariant::Transform返回--对应于范围中的值--通过QMetaType::QRegExp返回的值和通过QMetaType::QQuaternion返回的QMetaType::QFont值。 还请注意,void*、long、short、unsigned long、unsigned short、unsigned char、float、QObject*和QWidget*类型在QMetaType::Type中表示,而不是在QVariant::Type中表示,它们可以由该函数返回。但是,当对QVariant::Type进行测试时,它们被认为是用户定义的类型。
换句话说,函数QVariant::type()返回作为QVariant::Type类型的QMetaType::Type的值,这两个枚举共享它们的枚举器的很多(但不是全部)。这使得在一个严格的类型系统中处理它们变得困难--它们基本上是摇摇欲坠的、类型的--wypey的东西。
在您的示例中,请注意枚举器QMetaType::Float是那些在QVariant::Type中没有直接等效项的枚举器。
我想说的是,最好的方法是将variantType更改为QMetaType::Type,并在必要时对Qt文档进行转换和/或注释。
发布于 2015-07-08 13:10:29
只需打开QMetaType::Type即可。这样做是有效的,因为QVariant::type()的意思是QMetaType::Type,尽管返回类型是QVariant::Type。这是一个API怪癖/bug,您必须解决这个问题:
QVariant variant = ...;
switch (static_cast<QMetaType::Type>(variant.type())) {
...
}这种怪癖的原因完全是历史性的。QVariant::type()返回一个“错误”类型,只是为了在Qt 5系列中保持二进制兼容性。在Qt 6中,IIRC QVariant::Type只是QMetaType::Type的别名(可能也是不推荐的别名)。
发布于 2015-07-08 11:05:39
QVariant::Type不包含名为Float的条目(参见qvariant.h)
https://stackoverflow.com/questions/31290606
复制相似问题