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 ответ

Решение

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

  1. Регистрация контейнера последовательности C++ с помощью механизма сценариев приведена в разделе qScriptRegisterSequenceMetaType(), В документации функции есть пример для вектора типа int.

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

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

Другие вопросы по тегам