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

Qt: How are arrays or dictionaries passed from qscriptengine?

本文关键字:qscriptengine 传递 字典 数组 Qt      更新时间:2023-10-16

我已经创建了一个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 vector的示例。

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

  3. 通过索引访问。

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