2016-11-06 2 views
0

Я создал QScriptEngine и открыл функцию объекта, которую я могу вызвать из js-скрипта.Qt: Как передаются массивы или словари из qscriptengine?

engine->globalObject().setProperty("obj", myObj); 

myObj является QObject, который имеет функцию как ...

void MyObject::doSomething(int w, int h) { 
    ... 
} 

и в моем JS код, я могу назвать это как ...

obj.doSomething(5, 9); 

Это работает Я ожидаю, что это произойдет, но я не могу найти какие-либо документы о передаче массивов или словарей этим функциям. Например, если бы я хотел, чтобы передать массив, как бы я определить функцию C++, так что я мог бы сделать что-то вроде этого ...

obj.doSomething([1,2,3], "foo"); 

Будет ли это быть что-то вроде ...

void MyObject::doSomething(QVector<QVariant> firstArg, QString secondArg); 

Трудно это решить, поскольку, когда это не работает, звонок, кажется, терпит неудачу.

+0

Вы пробовали QVariantList? – jpnurmi

ответ

1

Для массивов у вас есть два варианта

  1. регистрируя контейнер C++ последовательности с обработчиком сценариев см qScriptRegisterSequenceMetaType(). В документации к функции есть пример для вектора int.

  2. Использовать QScriptValue как аргумент функции. Переданный объект, то можно проверить, если это массив (QScriptValue::isArray()) и доступ к индексу, используя QScriptValue::property()

Вариант (2) также работает для словарей (объектов в JavaScript).

+0

Вариант 2 казался простым подходом. Я использовал QScriptValue.property («длина»), чтобы получить длину и QScriptValue («INDEX_HERE»), чтобы получить определенный индекс. Благодарю. – voodoogiant