警告
本节包含自动从 C++ 转译到 Python 的代码片段,可能包含错误。
使应用程序可脚本化#
在 Qt 应用程序中内嵌 JavaScript。
Qt 提供了对应用程序脚本化的 JavaScript 支持。以下指南和参考涵盖了使用 JavaScript 和 Qt 进行编程的各个方面。
脚本类#
以下类为 Qt 应用程序添加了脚本功能。
QJSEngine 类提供了一个评估 JavaScript 代码的环境。
QJSPrimitiveValue 类在 JavaScript 语义下操作原始类型。
QJSValue 类作为 Qt/JavaScript 数据类型的容器。
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引擎的沙箱仅是一个语义屏障。脚本将与应用程序的其余部分在相同的进程中评估,享有相同的权限,并共享相同的内存。因此,暴露给脚本的对象是无需额外安全保护即可访问的。