从C ++区分QML数组和地图/对象类型

时间:2019-03-11 19:34:12

标签: c++ arrays qml

考虑QML,例如:

Item {
  objectName: "myitem"

  // arrays  
  property var arr1: [1,2,3]
  property var arr2: ['a','b','c']
  property var arr3: [{'a':1,'b':2},{},{}]

  // maps/objects
  property var map1: {'a':1,'b':2}
  property var map2: {'l1':[1,2,3], 'l2':[4,5,6]}
}

如何从C ++确定属性(按名称)是列表还是映射?

例如:

QObject* item = root->findChild<QObject*>("myitem");
QVariant value = item->property(propName);
bool isList = value.canConvert<QVariantList>();
bool isMap = value.canConvert<QVariantMap>();

对于所有这些属性,isListisMap为真。

value.type()似乎也没有太大帮助(在两种情况下都给出1024-QMetaType::User)。

我事先不知道QML属性的类型。

还:如果我使用Javascript从Javascript代码中的数组和对象中分配属性,这些类型是否与上面静态指定的QML文字相同?

QJSValue在这里有用吗?

仅供参考:我正在与另一个表示简单类型以及它们的数组和映射的类型系统进行交互,我希望动态地与QML数组和映射属性进行相互转换。包括地图的嵌套数组和具有数组值等的地图(尽管地图键始终是字符串)。

1 个答案:

答案 0 :(得分:0)

显然,当Qt将QML Javascript引擎数组和对象转换回QVariant时,它不会立即将它们转换为QVariantListQVariantMap,而只是包装了QML Javascript引擎类型

注意到value.type()产生QMetaType::User,而value.userType()产生qMetaTypeId<QJSValue>()的值,QVariant只是包装了QJSValue。如果您知道要呼叫哪个,则调用value.toList()value.toMap()会按预期进行转换。

但是,我们可以按如下所示对其进行强制转换:

QVariant variant = qvariant_cast<QJSValue>(value).toVariant();
bool isList = variant.type() == QMetaType::QVariantList;
bool isMap = variant.type() == QMetaType::QVariantMap;