考虑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>();
对于所有这些属性,isList
和isMap
为真。
value.type()
似乎也没有太大帮助(在两种情况下都给出1024-QMetaType::User
)。
我事先不知道QML属性的类型。
还:如果我使用Javascript从Javascript代码中的数组和对象中分配属性,这些类型是否与上面静态指定的QML文字相同?
QJSValue
在这里有用吗?
仅供参考:我正在与另一个表示简单类型以及它们的数组和映射的类型系统进行交互,我希望动态地与QML数组和映射属性进行相互转换。包括地图的嵌套数组和具有数组值等的地图(尽管地图键始终是字符串)。
答案 0 :(得分:0)
显然,当Qt将QML Javascript引擎数组和对象转换回QVariant
时,它不会立即将它们转换为QVariantList
或QVariantMap
,而只是包装了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;