Making Applications Scriptable

Making Applications Scriptable

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++ 对象无需额外的安全防护即可访问。

相关

各银行账号开头数字
mobile3656

各银行账号开头数字

📅 08-11 👁️ 1146
神奇!剥鸡蛋,用这招不粘壳,3秒蛋壳自动脱落
上手实测ZF厂万国葡计复刻表!这做工细节,复刻圈的“标杆级”存在