警告

本节包含自动从 C++ 转译到 Python 的代码片段,可能包含错误。

使应用程序可脚本化#

在 Qt 应用程序中内嵌 JavaScript。

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

脚本类#

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

PySide6.QtQml.QJSEngine

QJSEngine 类提供了一个评估 JavaScript 代码的环境。

PySide6.QtQml.QJSPrimitiveValue

QJSPrimitiveValue 类在 JavaScript 语义下操作原始类型。

PySide6.QtQml.QJSValue

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

PySide6.QtQml.QJSValueIterator

QJSValueIterator 类为 QJSValue 提供了 Java 风格的迭代器。

基本用法#

为了评估脚本代码,你需要创建一个 QJSEngine 对象,并通过其 evaluate() 方法定义要评估的脚本代码(文本)作为参数。

engine = QJSEngine()
print("the magic number is:", engine.evaluate("1 + 2").toNumber())

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

可以通过在脚本引擎中注册它们来将自定义属性提供给脚本。这通常通过设置脚本引擎的 全局对象 的属性来完成。

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

这将在脚本环境中放置属性,从而使其可供脚本代码使用。

将 QObject 可用于脚本引擎#

任何基于 QObject 的实例都可以用于脚本。

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

以下是一个将 QObject 子类实例可用于脚本代码的示例,该实例命名为 "myObject"

engine = QJSEngine()
someObject = MyObject()
objectValue = engine.newQObject(someObject)
engine.globalObject().setProperty("myObject", objectValue)

这将创建一个名为 myObject 的全局变量在脚本环境中。该变量作为底层 C++ 对象的代理。请注意,脚本变量的名称可以是任何东西;即,它与 QObject::objectName() 不一样。

应用程序安全的影响#

使用 JavaScript 进行应用程序脚本化的安全模型与 C++ 代码相同:用户像安装 Qt 应用程序一样信任运行它们安装的脚本。

为了维护用户的信任,应用程序开发人员不应评估任意JavaScript代码。JavaScript引擎的沙箱仅是一个语义屏障。脚本将与应用程序的其余部分在相同的进程中评估,享有相同的权限,并共享相同的内存。因此,暴露给脚本的对象是无需额外安全保护即可访问的。