首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMetaType::浮动不在QVariant::Type中

QMetaType::浮动不在QVariant::Type中
EN

Stack Overflow用户
提问于 2015-07-08 10:55:28
回答 3查看 4.2K关注 0票数 7

我有一个应用程序运行良好,但它没有编译与警告打开。我试着把它打开,把它们分类,但是没有解决这个问题的想法。我有:

代码语言:javascript
复制
QVariant someVar     
QVariant::Type variantType = someVar.type();
switch (variantType) {
    case QMetaType::QString:
        doSomething1();
        break;
    case QMetaType::Float:
        doSomething2();
        break;
}

并得到以下警告/错误:

代码语言:javascript
复制
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,它有同样的错误。以前有人遇到过这种事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-08 11:54:59

在没有这两个枚举(QMetaType::TypeQVariant::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*longshortunsigned longunsigned shortunsigned charfloatQObject*QWidget*类型在QMetaType::Type中表示,而不是在QVariant::Type中表示,它们可以由该函数返回。但是,当对QVariant::Type进行测试时,它们被认为是用户定义的类型。

换句话说,函数QVariant::type()返回作为QVariant::Type类型的QMetaType::Type的值,这两个枚举共享它们的枚举器的很多(但不是全部)。这使得在一个严格的类型系统中处理它们变得困难--它们基本上是摇摇欲坠的、类型的--wypey的东西。

在您的示例中,请注意枚举器QMetaType::Float是那些在QVariant::Type中没有直接等效项的枚举器。

我想说的是,最好的方法是将variantType更改为QMetaType::Type,并在必要时对Qt文档进行转换和/或注释。

票数 10
EN

Stack Overflow用户

发布于 2015-07-08 13:10:29

只需打开QMetaType::Type即可。这样做是有效的,因为QVariant::type()的意思是QMetaType::Type,尽管返回类型是QVariant::Type。这是一个API怪癖/bug,您必须解决这个问题:

代码语言:javascript
复制
QVariant variant = ...;
switch (static_cast<QMetaType::Type>(variant.type())) {
  ...
}

这种怪癖的原因完全是历史性的。QVariant::type()返回一个“错误”类型,只是为了在Qt 5系列中保持二进制兼容性。在Qt 6中,IIRC QVariant::Type只是QMetaType::Type的别名(可能也是不推荐的别名)。

票数 3
EN

Stack Overflow用户

发布于 2015-07-08 11:05:39

QVariant::Type不包含名为Float的条目(参见qvariant.h)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31290606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档