首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QVariant中的QList,QVariant:: type ()返回奇怪的类型

QVariant中的QList,QVariant:: type ()返回奇怪的类型
EN

Stack Overflow用户
提问于 2019-09-30 02:27:47
回答 1查看 459关注 0票数 3

我尝试将QList<int>存储在QVariant中,然后进行类型检查以确定存储在QVariant中的值的确切类型(用于序列化)。对于intQString这样的标量类型,QVariant::type()可以很好地工作,但这就是我使用QList<int>得到的结果

代码语言:javascript
复制
QList<int> list{1,2,3};
QVariant v = QVariant::fromValue<QList<int>>(list);
qDebug() << v.type() << "|" << v.typeName() << "|" << v.userType() << "|" << QVariant::typeToName(v.type());

产生:

代码语言:javascript
复制
QVariant::QWidget* | QList<int> | 1030 | QWidget*

这个QVariant::QWidget*到底是从哪里来的?我在QVariant的enum Type中找不到它,也找不到value1030。Q_DECLARE_METATYPE(QList<int>);不起作用。

这是怎么回事?或者我应该使用typeName(),因为它返回正确的类型名而不是type()

Qt 5.13.1,clang 8.0.1,Linux 64位

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-01 12:27:55

QList<T>实际上不是一个预定义的变体类型(除了QList<QVariant>),所以从技术上讲,它解析为一个QMetaType::UserType。这有点令人费解,而且肯定取决于包含了哪些Qt模块(元类型系统被设计为以这种方式进行扩展--例如。如果没有GUI模块,你就不会有这些类型中的任何一种)。

所以..。实际上,“知道”底层自定义类型的是QMetaType。从给定的示例中,QVariant::typeToName(v.userType())可以正确地打印QList<int>。我发现QVariant::userType()总是返回实际的元类型,而type()似乎没有什么用处(甚至文档也很费解地解释它是如何工作的)。

更令人困惑的是,QVariant::Type似乎已被弃用...如果你点击docs for type()中的"QVariant::Type“链接,它会转到”过时的成员“部分。其中甚至没有列出该枚举。

实际上,在使用(或注册) QList<int>类型之前,QMetaType也不会“知道”它。示例:

代码语言:javascript
复制
    qDebug() << QMetaType::type("QList<int>");  // prints 0
    QList<int> list{1,2,3};
    QVariant v = QVariant::fromValue(list);
    qDebug() << QMetaType::type("QList<int>");  // prints 1028 on my test project, yours may vary

或者,如果是专门注册的:

代码语言:javascript
复制
    qDebug() << qRegisterMetaType<QList<int> >("QList<int>");  // prints 1028
    qDebug() << QMetaType::type("QList<int>");  // prints 1028
    QList<int> list{1,2,3};
    QVariant v = QVariant::fromValue(list);
    qDebug() << QMetaType::type("QList<int>");  // still 1028
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58158034

复制
相关文章

相似问题

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