【发布时间】:2019-09-29 18:27:47
【问题描述】:
我正在尝试将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 位
【问题讨论】:
-
这只是一个观察:如果只包含
core或gui模块,我会得到:QVariant::QList<int> | QList<int> | 1024 | QList<int>,但如果你添加widgets,我会得到:QVariant::QWidget* | QList<int> | 1025 | QWidget* -
它只是返回最后注册的
QMetaType那里(1024 是“用户”范围的开始)。当然,另一个令人困惑的地方。