使应用程序可编写脚本

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

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.