我正在尝试存储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(使用前将#替换为@)