使应用程序可脚本化

Qt 提供对应用脚本支持,使用 JavaScript。以下指南和参考资料涵盖了使用 JavaScript 和 Qt 编程的各个方面。

脚本类

以下类为 Qt 应用程序添加脚本功能。

QJSEngine

JavaScript 代码评估环境

QJSPrimitiveValue

在 JavaScript 语义操作原语类型

QJSValue

作为 Qt/JavaScript 数据类型的容器

QJSValueIterator

QJSValue 的 Java 风格迭代器

基本用法

要评估脚本代码,您创建一个 QJSEngine 并调用其 evaluate() 函数,将要进行评估的脚本代码(文本)作为参数传递。

QJSEngine engine;
qDebug() << "the magic number is:" << engine.evaluate("1 + 2").toNumber();

返回值将是评估的结果(表示为 QJSValue 对象);这可以转换为标准 C++ 和 Qt 类型。

可以通过在脚本引擎中注册它们来使自定义属性可供脚本使用。这最简单地通过设置脚本引擎的 全局对象 的属性来完成。

engine.globalObject().setProperty("foo", 123);
qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();

这会将属性放置在脚本环境中,从而使它们可用于脚本代码。

使 QObject 对象可用于脚本引擎

可以使得任何 QObject-基于实例可供脚本使用。

当将 QObject 传递到 QJSEngine::newQObject() 函数时,将会创建一个可以用于使 QObject 的信号、槽、属性和子对象可用于脚本的 Qt 脚本包装对象。

以下是一个将一个 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++ 对象无需额外的安全卫士即可访问。

† 2024 The Qt Company Ltd. 除非另行注明,此处包含的文档贡献内容均为各自所有者的版权。本提供的文档受GNU自由文档许可证(版本1.3)的条款约束,该许可证由自由软件基金会发布。[链接](http://www.gnu.org/licenses/fdl.html)。Qt及其相关标志是The Qt Company Ltd.在芬兰和其他国家/地区的商标。[商标链接](https://doc.qt.ac.cn/qt/trademarks.html)。所有其他商标均为各自所有者的财产。