gpt4 book ai didi

c++ - QVariant 中的 QList,QVariant::type() 返回奇怪的类型

转载 作者:太空狗 更新时间:2023-10-29 22:53:56 29 4
gpt4 key购买 nike

我正在尝试存储 QList<int>QVariant然后进行类型检查以确定存储在 QVariant 中的值的确切类型(用于序列化)。 QVariant::type()适用于 int 等标量类型或 QString , 但这是我用 QList<int> 得到的:

QList<int> list{1,2,3};
QVariant v = QVariant::fromValue<QList<int>>(list);
qDebug() << v.type() << "|" << v.typeName() << "|" << v.userType() << "|" << QVariant::typeToName(v.type());

产生:

QVariant::QWidget* | QList<int> | 1030 | QWidget*

这在哪里 QVariant::QWidget*甚至来自?我在 QVariant 的 enum Type 中找不到它,也不是值 1030。Q_DECLARE_METATYPE(QList<int>);没有影响。

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

Qt 5.13.1,clang 8.0.1,Linux 64 位

最佳答案

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”链接它转到“过时成员”部分。甚至没有列出该枚举的地方。

实际上 QMetaType不“知道”QList<int>键入直到它被使用(或注册)。示例:

    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

或者,如果专门注册:

    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

关于c++ - QVariant 中的 QList,QVariant::type() 返回奇怪的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58158034/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com