使应用程序支持脚本操作
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()函数时,会创建一个Qt Script包装器对象,该对象可用于将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++ 对象在没有额外安全防护的情况下即可被访问。
© 2026 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.