Russian Qt Forum
Январь 31, 2023, 00:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача ассоциативного массива из QML в C++. Преобразование QJSValue в QVariant  (Прочитано 961 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Сентябрь 29, 2022, 10:12 »

Имеется 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++ никто ничего структурированного не передает.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4338



Просмотр профиля
« Ответ #1 : Сентябрь 29, 2022, 10:52 »

QJSValueIterator

QJSValue QJSValue::property(const QString &name) const
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Сентябрь 29, 2022, 17:37 »

QJSValueIterator
QJSValue QJSValue::property(const QString &name) const

Решение тут: https://www.linux.org.ru/forum/development/16985890
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.