QMetaType::Float not in 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::Type
和QVariant::Type
)上玩了一些肮脏的把戏。引用4.8.4 docs on QVariant::type()
:
返回存储在变量中的值的存储类型。虽然这个函数被声明为返回
QVariant::Type
,但是返回值应该被解释为QMetaType::Type
。特别地,只有当值等于或大于QMetaType::User
时,才返回QVariant::UserType
。请注意,
QVariant::Char
~QVariant::RegExp
和QVariant::Font
~QVariant::Transform
的返回值与QMetaType::QChar
~QMetaType::QRegExp
和QMetaType::QFont
~QMetaType::QQuaternion
的返回值相对应。还要注意,
void*
、long
、short
、unsigned long
、unsigned short
、unsigned char
、float
、QObject*
和QWidget*
类型在QMetaType::Type
中表示,而在QVariant::Type
中没有,它们可以通过这个函数返回。但是,在针对QVariant::Type
进行测试时,它们被认为是用户定义的类型。
换句话说,函数QVariant::type()
返回类型为QVariant::Type
的QMetaType::Type
的值,并且这两个枚举共享很多(但不是全部)枚举数。这使得在严格的类型系统中处理它们变得困难——它们基本上是一种摇摆不定的类型。
在您的示例中,请注意,枚举数QMetaType::Float
是而不是在QVariant::Type
中有直接等效的枚举数之一。
我想说,沉默警告的最好方法是将variantType
更改为QMetaType::Type
,可能会对初始化进行强制转换和/或必要时引用Qt文档的注释。
只需打开QMetaType::Type
。这样做是有效的,因为尽管返回类型是QVariant::Type
,但QVariant::type()
的含义是QMetaType::Type
的含义。这是一个API的怪癖/bug,你必须解决:
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)
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 将系数存储在头文件的数组中("does not name a type"错误)
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- OpenCV CV_16F type
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- 将内存分配返回值强制转换为 TYPE 数组
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- reference_wrapper导致"incomplete type is not allowed"
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 由于"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int",我现在无法编
- 为什么QVariant::type()返回一个QVariant::type,而它应该被解释为QMetaType:: ty
- QMetaType::Float not in QVariant::Type