我有一个从QML文件调用的可调用c ++函数。我希望此函数接受javascript对象(或地图)列表作为参数。 Qt文档指出javascript列表已转换为QVariantList,而javascript对象已转换为QVariantMap。 (see here,本节最后一段)。
类似地,如果C ++类型将QVariantList或QVariantMap类型用作属性类型或方法参数,则该值可以在QML中创建为JavaScript数组或对象,并在传递时自动转换为QVariantList或QVariantMap。到C ++。
不幸的是,当参数键入为QVariantList
,QList<QVariant>
或什至QVariant
(然后转换为QList<QVariant>
)时,返回的长度为0。我也尝试过将其键入为QList<QObject*>
,并且可以读取列表的长度,但是由于无法将QObject *强制转换为QVariant,因此我无法访问其中的数据。
QML代码摘录:
for(currentLabel = 0; currentLabel<acquisitionsLabels.length; currentLabel++){
label = acquisitionsLabels[currentLabel];
link = db.getLinkFromLabel(label)[0];
structureName="";
if(link){
criteria = db.getCriteriaFromId(link.fkCriteria);
structure = db.getStructureFromId(criteria.fkStructure);
structureName = structure.name;
}
labels.push({
"label":label,
"structureName":structureName,
"moreToCome":currentLabel<acquisitionsLabels.length-1
});
}
console.log(labels.length);
exportReportFile.printAcquisition(acquisition, acquisitionRenderer.renderAcquisition(acquisition), labels);
exportReportFile.cpp摘录:
void ExportReportFile::printAcquisition(QObject *a_acquisition, const QVariant& a_labels){
QList<QVariant> l_labels = a_labels.value<QList<QVariant>>();
std::cout << typeid(l_labels).name() << std::endl;
std::cout << l_labels.count() << std::endl;
if(l_labels.length()>0){
for(int i=0;i<l_labels.count();i++) {
auto item = l_labels.at(i);
std::cout << typeid(item).name() << std::endl;
}
}
}
此版本的参数是一个QVariant
引用,但我也尝试了所有以前引用的类型。
长度为3项的列表的预期输出为:
qml: 3
class QList<class QVariant>
3
class QVariant
class QVariant
class QVariant
实际上是
qml: 3
class QList<class QVariant>
0
答案 0 :(得分:0)
创建一个以QJSValue
作为参数的方法。这样,值不会转换为QVariant
,而是会返回实际的JS数据。然后,您可以根据需要继续进行操作,包括在需要时转换为QVariant:
void ExportReportFile::printAcquisition(QObject *a_acquisition, const QJSValue& a_labels) {
// do stuff with it:
const int length = jsArray.property("length").toInt();
for (int i = 0; i < length; ++i) {
auto arrayElement = jsArray.property(i);
// now you have the element etc.
}
}