У меня есть вызываемая функция c ++, которую я вызываю из файла QML. Я хотел бы, чтобы эта функция принимала список объектов javascript (или карт) в качестве аргумента. Документация Qt указывает, что списки javascript переводятся в QVariantList, а объекты javascript - в QVariantMap. ( см. Здесь , последний абзац раздела).
Аналогично, если тип C ++ использует тип QVariantList или QVariantMap для типа свойства или параметра метода, значение может быть создано как массив или объект JavaScript в QML и автоматически преобразовывается в 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