【问题标题】:QList in QVariant, QVariant::type() returns weird typeQVariant中的QList,QVariant::type()返回奇怪的类型
【发布时间】:2019-09-29 18:27:47
【问题描述】:

我正在尝试将QList<int> 存储在QVariant 中,然后进行类型检查以确定存储在QVariant 中的值的确切类型(用于序列化)。 QVariant::type() 适用于 intQString 等标量类型,但这是我使用 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&lt;int&gt;);没有效果。

这里有什么问题?或者我应该使用typeName(),因为它返回正确的类型名称而不是type()

Qt 5.13.1、clang 8.0.1、Linux 64 位

【问题讨论】:

  • 这只是一个观察:如果只包含 coregui 模块,我会得到:QVariant::QList&lt;int&gt; | QList&lt;int&gt; | 1024 | QList&lt;int&gt;,但如果你添加 widgets,我会得到:QVariant::QWidget* | QList&lt;int&gt; | 1025 | QWidget*
  • 它只是返回最后注册的QMetaType 那里(1024 是“用户”范围的开始)。当然,另一个令人困惑的地方。

标签: c++ qt qvariant


【解决方案1】:

QList&lt;T&gt; 并不是真正的预定义变体类型(QList&lt;QVariant&gt; 除外),因此它在技术上解析为 QMetaType::UserType。这有点令人费解,并且绝对取决于包含了哪些 Qt 模块(元类型系统旨在以这种方式扩展——例如,如果没有 GUI 模块,您将没有任何可用的类型)。

所以...实际上是QMetaType“了解”底层自定义类型。从给定的示例QVariant::typeToName(v.userType()) 正确打印QList&lt;int&gt;。我发现 QVariant::userType() 总是返回实际的元类型,而 type() 似乎毫无用处(即使是文档也很复杂,试图解释它是如何工作的)。

更令人困惑的是,QVariant::Type 似乎已被弃用...如果您单击docs for type() 中的“QVariant::Type”链接,它会转到“过时成员”部分。该枚举甚至没有列出。

实际上QMetaType 在使用(或注册)之前并不“知道”QList&lt;int&gt; 类型。示例:

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    相关资源
    最近更新 更多