Отправка списка объектов javascript из QML в c ++ - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть вызываемая функция 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

1 Ответ

0 голосов
/ 08 ноября 2018

Создайте метод, который принимает 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.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...