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

2024-01-06

我正在尝试存储QList<int> in QVariant然后进行类型检查以确定存储在中的值的确切类型QVariant(用于序列化)。QVariant::type()适用于标量类型,例如int or 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()) prints QList<int>正确。我发现QVariant::userType()总是返回实际的元类型,而只是type()似乎相当无用(即使文档也很复杂地试图解释它是如何工作的)。

为了增加混乱,QVariant::Type似乎已被弃用...如果您单击“QVariant::Type”链接文档用于type() https://doc.qt.io/qt-5/qvariant.html#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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QVariant 中的 QList,QVariant::type() 返回奇怪的类型 的相关文章

随机推荐