Qt 支持使用 JavaScript 编写应用程序脚本。以下指南和参考资料涵盖了使用 JavaScript 和 Qt 编程的各个方面。
脚本类
以下类为 Qt 应用程序添加了脚本功能。
QJSEngine
评估 JavaScript 代码的环境
QJSPrimitiveValue
在 JavaScript 语义中对原始类型进行操作
QJSValue
充当 Qt/JavaScript 数据类型的容器
QJSValueIterator
用于 QJSValue 的 Java 风格迭代器
基本用法
要评估脚本代码,您需要创建一个QJSEngine 并调用其 evaluate() 函数,将要评估的脚本代码(文本)作为参数传递。
QJSEngine引擎qDebug() << "the magic number is:" << engine.evaluate("1 + 2").toNumber();
返回值将是求值结果(以QJSValue 对象表示);可转换为标准 C++ 和 Qt XML 类型。
自定义属性可通过在脚本引擎中注册的方式提供给脚本。设置脚本引擎全局对象的属性最容易做到这一点:
engine.globalObject().setProperty("foo", 123);qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();
这样就把属性放到了脚本环境中,从而使脚本代码可以使用这些属性。
向脚本引擎提供 QObject
任何基于QObject 的实例都可用于脚本。
当QObject 传递给QJSEngine::newQObject() 函数时,就会创建一个 Qt XML 脚本包装器对象,用于将QObject 的信号、插槽、属性和子对象提供给脚本使用。
下面是一个示例,说明如何将QObject 子类的实例以"myObject" 的名称提供给脚本代码:
QJSEngine engine;
QObject *someObject = new MyObject;
QJSValue objectValue = engine.newQObject(someObject);
engine.globalObject().setProperty("myObject", objectValue);
这将在脚本环境中创建一个名为myObject 的全局变量。该变量将作为底层 C++ 对象的代理。请注意,脚本变量的名称可以是任何名称;也就是说,它不依赖于QObject::objectName()。
对应用程序安全的影响
使用 JavaScript 编写应用程序脚本的安全模型与 C++ 代码的模型相同:用户安装他们信任的脚本来运行,就像安装 Qt 应用程序一样。
为了维护用户的信任,应用程序开发人员不应评估任意 JavaScript 代码。JavaScript 引擎的沙箱只是一个语义屏障。脚本在同一进程中进行评估,与应用程序的其他部分具有相同的权限,并共享相同的内存。因此,暴露给脚本的 C++ 对象无需额外的安全防护即可访问。