C++ 从C+;读取QML数组属性+;

C++ 从C+;读取QML数组属性+;,c++,qml,C++,Qml,给定QML,例如: Item { objectName: "myitem" property var myarr: [1,2,3] } 如何从C++ ++ < /P>中读取? 以下操作不起作用: QObject*item=root->findChild(“myitem”); QVariant value=项目->属性(“myarr”); 而value.isValid()返回true,如果我查询QMetaType::typeName(QMetaType::Type(int(value.

给定QML,例如:

Item {
  objectName: "myitem"
  property var myarr: [1,2,3]
}
如何从C++ ++ < /P>中读取? 以下操作不起作用:

QObject*item=root->findChild(“myitem”);
QVariant value=项目->属性(“myarr”);
value.isValid()
返回true,如果我查询
QMetaType::typeName(QMetaType::Type(int(value.Type())))
它产生“QWidget*”


(在x86上使用Qt 5.9.4)

这将返回QVariant的列表,因为它是最通用的类型,在下一个示例中,我将其解包并存储在一个容器中:

if(QObject *item = root->findChild<QObject *>("myitem")){
    std::vector<int> vector; // another option std::vector<float>;
    for(const QVariant & v: item->property("myarr").toList()){
       vector.push_back(v.toInt()); // another option toFloat();
    }
    qDebug() << vector;
}
if(QObject*item=root->findChild(“myitem”)){
std::vector;//另一个选项std::vector;
对于(const QVariant&v:item->property(“myarr”).toList()){
vector.push_back(v.toInt());//另一个选项toFloat();
}

qDebug()谢谢。在一个相关的注释中-如何检测属性是列表还是其他东西(例如映射)的任何线索?如果我调用
value.canConvert(QMetaType::Type::QVariantList)
它返回true,但是
canConvert(QMetaType::Type::QVariantMap)也返回true)
@DavidJ我不喜欢从QML到C++获取数据,这种方法总是会带来兼容性问题,相反,我创建了一个QObject,它具有QProperty来管理业务逻辑,并使用setContextProperty导出。您现在遇到的问题并不危险,但例如,QML会动态创建和删除元素,然后您获得了该项,但QML删除了该项,因此指针将指向非保留内存。我建议您阅读:在本例中,这是不可能的,因为属性属于从另一种声明性标记语言交叉转换生成的动态创建和加载的QML。