我尝试将QList<int>存储在QVariant中,然后进行类型检查以确定存储在QVariant中的值的确切类型(用于序列化)。对于int或QString这样的标量类型,QVariant::type()可以很好地工作,但这就是我使用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中找不到它,也找不到value1030。Q_DECLARE_METATYPE(QList<int>);不起作用。
这是怎么回事?或者我应该使用typeName(),因为它返回正确的类型名而不是type()
Qt 5.13.1,clang 8.0.1,Linux 64位
发布于 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也不会“知道”它。示例:
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 1028https://stackoverflow.com/questions/58158034
复制相似问题