Имеется Qt 5.11.
Вызываю функцию из QML через JavaScript. В качестве параметра передается ассоциативный массив (индексы - строки и значения - строки).
var a;
a["one"]=odin;
a["two']=dva;
ourExemplar.ourMethod(a);
В документации сказано, что такой массив должен автоматически преобразовываться в QVariantMap.
https://doc.qt.io/qt-5/qtqml-cppintegration-data.html
Однако все, что я могу вытащить из QJSValue - это QVariantList (это алиас QList<QVariant>). Да и то этот список будет нуливого размера.
Вот код:
void OurClass::ourMethod(QJSValue jsVal)
{
qDebug() << Q_FUNC_INFO << "Слот ourMethod()";
qDebug() << "Результат isObject(): " << jsVal.isObject();
qDebug() << "Результат isQObject(): " << jsVal.isQObject();
qDebug() << "Результат isArray(): " << jsVal.isArray();
qDebug() << "Результат isVariant(): " << jsVal.isVariant();
qDebug() << "QJSValue содержит тип " << jsVal.toVariant().userType();
qDebug() << "Тип QVariant " << qMetaTypeId<QVariant>();
qDebug() << "Тип QVariantList " << qMetaTypeId<QVariantList>();
qDebug() << "Тип QVariantMap " << qMetaTypeId<QVariantMap>();
qDebug() << "Тип QJSValue: " << qMetaTypeId<QJSValue>();
QVariantList list=jsVal.toVariant().toList();
qDebug() << "Длинна list: " << list.size();
Вот результат:
void OurClass::ourMethod(QJSValue) Слот ourMethod()
Результат isObject(): true
Результат isQObject(): false
Результат isArray(): true
Результат isVariant(): false
QJSValue содержит тип 9
Тип QVariant 41
Тип QVariantList 9
Тип QVariantMap 8
Тип QJSValue: 1056
Длинна list: 0
Здесь видно, что isObject() и isArray() одновременно выдают true. Не знаю, должно ли так быть.
Узнать какой тип содержится в QVariant элемента списка я не могу придумать как, так как нет даже первого элемента, ведь список пустой.
В общем, задача - передать ассоциативный массив из QML в C++, но я не могу разобраться как это сделать. Везде пишется как конвертить из C++ в QML, а мне надо наоборот. У буржуев нашел вот такое:
https://lists.qt-project.org/pipermail/development/2014-September/018513.html
Но тут тоже направление из C++ в QML. Как будто из QML в C++ никто ничего структурированного не передает.