使应用程序可脚本化
Qt 提供对应用脚本支持,使用 JavaScript。以下指南和参考资料涵盖了使用 JavaScript 和 Qt 编程的各个方面。
脚本类
以下类为 Qt 应用程序添加脚本功能。
JavaScript 代码评估环境 | |
在 JavaScript 语义操作原语类型 | |
作为 Qt/JavaScript 数据类型的容器 | |
QJSValue 的 Java 风格迭代器 |
基本用法
要评估脚本代码,您创建一个 QJSEngine 并调用其 evaluate() 函数,将要进行评估的脚本代码(文本)作为参数传递。
返回值将是评估的结果(表示为 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)。所有其他商标均为各自所有者的财产。