Qt:如何从 qscriptengine 传递数组或字典?

Qt: How are arrays or dictionaries passed from 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 向量的示例。

  2. 使用 QScriptValue 作为函数的参数。然后可以检查传递的对象是否为数组 (QScriptValue::isArray()) 并使用 QScriptValue::property()

  3. 通过索引访问

选项 (2) 也适用于字典(JavaScript 中的对象)。