Qt: Как массивы или словари передаются от qscriptengine?
Я создал QScriptEngine и показал функцию объекта, которую я могу вызвать из скрипта js.
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);
Трудно разобраться, потому что, когда он не работает, кажется, что звонок молча проваливается.
1 ответ
Для массивов у вас есть два варианта
Регистрация контейнера последовательности C++ с помощью механизма сценариев приведена в разделе
qScriptRegisterSequenceMetaType()
, В документации функции есть пример для вектора типа int.использование
QScriptValue
в качестве аргумента функции. Переданный объект может быть проверен, если это массив (QScriptValue::isArray()
) и доступ по индексу с использованиемQScriptValue::property()
Вариант (2) также работает для словарей (объекты в JavaScript).