QJSEngine Class
QJSEngine 类提供了一个用于评估 JavaScript 代码的环境。更多内容...
| 标题: | #include <QJSEngine> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
| qmake: | QT += qml |
| 继承自: | QObject |
| 被继承者: |
注:本类中的所有函数均为可重入的。
公共类型
| enum | Extension { TranslationExtension, ConsoleExtension, GarbageCollectionExtension, AllExtensions } |
| flags | Extensions |
| enum | ObjectOwnership { CppOwnership, JavaScriptOwnership } |
属性
- uiLanguage : QString
公共函数
| QJSEngine() | |
| QJSEngine(QObject *parent) | |
| virtual | ~QJSEngine() override |
(since Qt 6.1) QJSValue | catchError() |
| To | coerceValue(const From &from) |
| void | collectGarbage() |
| QJSValue | evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1, QStringList *exceptionStackTrace = nullptr) |
| T | fromManagedValue(const QJSManagedValue &value) |
| T | fromPrimitiveValue(const QJSPrimitiveValue &value) |
| T | fromScriptValue(const QJSValue &value) |
| T | fromVariant(const QVariant &value) |
| QJSValue | globalObject() const |
(since Qt 6.1) bool | hasError() const |
| QJSValue | importModule(const QString &fileName) |
| void | installExtensions(QJSEngine::Extensions extensions, const QJSValue &object = QJSValue()) |
| bool | isInterrupted() const |
| QJSValue | newArray(uint length = 0) |
| QJSValue | newErrorObject(QJSValue::ErrorType errorType, const QString &message = QString()) |
| QJSValue | newObject() |
| QJSValue | newQMetaObject() |
| QJSValue | newQMetaObject(const QMetaObject *metaObject) |
| QJSValue | newQObject(QObject *object) |
(since 6.2) QJSValue | newSymbol(const QString &name) |
| bool | registerModule(const QString &moduleName, const QJSValue &value) |
| void | setInterrupted(bool interrupted) |
| void | setUiLanguage(const QString &language) |
(since Qt 5.12) void | throwError(const QString &message) |
(since 6.1) void | throwError(const QJSValue &error) |
(since Qt 5.12) void | throwError(QJSValue::ErrorType errorType, const QString &message = QString()) |
| QJSManagedValue | toManagedValue(const T &value) |
| QJSPrimitiveValue | toPrimitiveValue(const T &value) |
| QJSValue | toScriptValue(const T &value) |
| QString | uiLanguage() const |
信号
| void | uiLanguageChanged() |
静态公共成员
| QJSEngine::ObjectOwnership | objectOwnership(QObject *object) |
| void | setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership) |
相关的非成员
| QJSEngine * | qjsEngine(const QObject *object) |
详细说明
脚本评估
使用 `evaluate()` 来执行脚本代码。
evaluate() 返回一个QJSValue ,其中包含求值结果。QJSValue 类提供了将结果转换为各种 C++ 类型的函数(例如QJSValue::toString() 和QJSValue::toNumber())。
以下代码片段演示了如何定义一个脚本函数,然后使用QJSValue::call()从C++中调用该函数:
QJSValue fun = myEngine.evaluate("(function(a, b) { return a + b; })");
QJSValueList args;
args << 1 << 2;
QJSValue threeAgain = fun.call(args);从上面的代码片段可以看出,脚本是以字符串的形式提供给引擎的。加载脚本的一种常见方法是读取文件内容,然后将其传递给evaluate():
QString fileName = "helloworld.qs";
QFile scriptFile(fileName);
if (!scriptFile.open(QIODevice::ReadOnly))
// handle error
QTextStream stream(&scriptFile);
QString contents = stream.readAll();
scriptFile.close();
myEngine.evaluate(contents, fileName);在此,我们将文件名作为第二个参数传递给evaluate()。这不会对脚本的执行产生任何影响;第二个参数是一个通用字符串,仅为调试目的存储在Error 对象中。
对于更复杂的功能,您可能希望将代码和数据封装到模块中。模块是一个包含脚本代码、变量等的文件,它使用 export 语句来描述其面向应用程序其余部分的接口。 借助 `import` 语句,模块可以引用其他模块中的功能。这使得能够以安全的方式,通过相互关联的较小构建块来构建脚本应用程序。相比之下,使用 `evaluate()` 的方法存在风险:一次 `evaluate()` 调用的内部变量或函数可能会意外污染全局对象,从而影响后续的代码执行。
以下示例提供了一个可进行数字加法的模块:
export function sum(left, right)
{
return left + right
}如果该模块以math.mjs 为名称保存,则可通过 QJSEngine::import() 加载它:
QJSvalue module = myEngine.importModule("./math.mjs");
QJSValue sumFunction = module.property("sum");
QJSValue result = sumFunction.call(args);模块还可以通过 import 语句使用其他模块的功能:
import { sum } from "./math.mjs";
export function addTwice(left, right)
{
return sum(left, right) * 2;
}模块不一定是文件。它们也可以是使用 `QJSEngine::registerModule()` 注册的值:
import version from "version";
export function getVersion()
{
return version;
}QJSValue version(610);
myEngine.registerModule("version", version);
QJSValue module = myEngine.importModule("./myprint.mjs");
QJSValue getVersion = module.property("getVersion");
QJSValue result = getVersion.call();支持命名导出,但由于它们被视为对象的成员,因此默认导出必须是一个 ECMAScript 对象。QJSValue 中的大多数 newXYZ 函数都会返回一个对象。
QJSValue name("Qt6");
QJSValue obj = myEngine.newObject();
obj.setProperty("name", name);
myEngine.registerModule("info", obj);import { name } from "info";
export function getName()
{
return name;
}引擎配置
globalObject() 函数返回与脚本引擎关联的全局对象。任何脚本代码均可访问该全局对象的属性(即这些属性是全局变量)。通常,在评估“用户”脚本之前,您需要通过向全局对象添加一个或多个属性来配置脚本引擎:
myEngine.globalObject().setProperty("myNumber", 123);
...
QJSValue myNumberPlusOne = myEngine.evaluate("myNumber + 1");向脚本环境添加自定义属性是提供应用程序专用脚本 API 的标准方法之一。通常,这些自定义属性是由newQObject() 或newObject() 函数创建的对象。
脚本异常
evaluate() 可能抛出脚本异常(例如因语法错误)。如果发生这种情况,evaluate() 将返回被抛出的值(通常是一个Error 对象)。请使用QJSValue::isError() 来检查异常。
若要了解有关该错误的详细信息,请使用QJSValue::toString() 获取错误消息,并使用QJSValue::property() 查询Error 对象的属性。可用的属性如下:
namemessagefileNamelineNumberstack
QJSValue result=myEngine.evaluate(...);
if(result.isError())
qDebug()
<< “第”行发生未捕获的异常
<<result.property("lineNumber").toInt()
<< “:” <<result.toString();脚本对象的创建
使用newObject() 创建 JavaScript 对象;这相当于 C++ 中的 script 语句new Object() 。您可以使用QJSValue 中的对象特定功能来操作该脚本对象(例如QJSValue::setProperty())。同样,使用newArray() 创建 JavaScript 数组对象。
QObject 集成
使用newQObject() 来封装QObject (或其子类)的指针。newQObject() 返回一个代理脚本对象;QObject 的属性、子对象以及信号和槽均可作为代理对象的属性使用。由于这是通过 Qt 元对象系统动态完成的,因此无需编写绑定代码。
QPushButton*button = newQPushButton;
QJSValue scriptButton=myEngine.newQObject(button);
myEngine.globalObject().setProperty("button",scriptButton);
myEngine.evaluate("button.checkable = true");
qDebug() << scriptButton.property("checkable").toBool();
scriptButton.property("show").call();// 调用 show() 插槽使用 `newQMetaObject()` 来封装 `QMetaObject`;这将为你提供一个基于 `QObject` 的类的“脚本表示形式”。`newQMetaObject()` 返回一个代理脚本对象;该类的枚举值可作为代理对象的属性使用。
通过Q_INVOKABLE 向元对象系统公开的构造函数,可从脚本中调用,以使用JavaScriptOwnership 创建新的QObject 实例。例如,给定以下类定义:
class MyObject : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE MyObject() {}
};该类的staticMetaObject 可按如下方式向JavaScript公开:
QJSValue jsMetaObject = engine.newQMetaObject(&MyObject::staticMetaObject);
engine.globalObject().setProperty("MyObject", jsMetaObject);随后,可以在 JavaScript 中创建该类的实例:
engine.evaluate("var myObject = new MyObject()");QObject 的动态属性
不支持动态的QObject 属性。例如,以下代码将无法运行:
QJSEngine engine;
QObject*myQObject = newQObject();
myQObject->setProperty("dynamicProperty", 3);
QJSValue myScriptQObject=engine.newQObject(myQObject);
engine.globalObject().setProperty("myObject",myScriptQObject);
qDebug() << engine.evaluate("myObject.dynamicProperty").toInt();扩展
QJSEngine 提供了一个符合 ECMAScript 标准的实现。默认情况下,诸如日志记录等常用工具不可用,但可以通过installExtensions() 函数进行安装。
另请参阅 QJSValue 、实现应用程序的可脚本化以及JavaScript 对象和函数列表。
成员类型文档
enum QJSEngine::Extension
flags QJSEngine::Extensions
此枚举用于指定要通过installExtensions() 安装的扩展。
| 常量 | 值 | 描述 |
|---|---|---|
QJSEngine::TranslationExtension | 0x1 | 表示应安装翻译函数(例如qsTr() )。这还会安装 Qt.uiLanguage 属性。 |
QJSEngine::ConsoleExtension | 0x2 | 表示应安装控制台函数(例如console.log() )。 |
QJSEngine::GarbageCollectionExtension | 0x4 | 表示应安装垃圾回收函数(例如gc() )。 |
QJSEngine::AllExtensions | 0xffffffff | 表示应安装所有扩展。 |
TranslationExtension
下表描述了脚本翻译函数与 C++ 翻译函数之间的关系:
| 脚本函数 | 对应的 C++ 函数 |
|---|---|
| qsTr() | QObject::tr() |
| QT_TR_NOOP() | QT_TR_NOOP() |
| qsTranslate() | QCoreApplication::translate() |
| QT_TRANSLATE_NOOP() | QT_TRANSLATE_NOOP() |
| qsTrId() | qtTrId() |
| QT_TRID_NOOP() | QT_TRID_NOOP() |
该标志还会向字符串原型添加一个arg() 函数。
有关更多信息,请参阅《Qt 国际化》文档。
ConsoleExtension
控制台对象实现了Console API 的子集,该 API 提供了诸如console.log() 等常用的日志记录函数。
添加的函数列表如下:
console.assert()console.debug()console.exception()console.info()console.log()(等同于console.debug())console.error()console.time()console.timeEnd()console.trace()console.count()console.warn()print()(等同于console.debug())
有关更多信息,请参阅控制台 API文档。
GarbageCollectionExtension
gc() 函数等同于调用collectGarbage()。
Extensions 类型是QFlags<Extension> 的 typedef。它存储 Extension 值的或(OR)组合。
enum QJSEngine::ObjectOwnership
ObjectOwnership 控制当相应的 JavaScript 对象被引擎进行垃圾回收时,JavaScript 内存管理器是否会自动销毁QObject 。所有权选项有两种:
| 常量 | 值 | 描述 |
|---|---|---|
QJSEngine::CppOwnership | 0 | 该对象由 C++ 代码拥有,JavaScript 内存管理器绝不会删除它。JavaScript 的 destroy() 方法不能用于此类对象。此选项与 QScriptEngine::QtOwnership 类似。 |
QJSEngine::JavaScriptOwnership | 1 | 该对象由 JavaScript 拥有。当对象作为方法调用的返回值交还给 JavaScript 内存管理器时,JavaScript 内存管理器将对其进行追踪,并在该对象不存在任何剩余的 JavaScript 引用且未调用 `QObject::parent()` 时将其删除。 由一个QJSEngine 所追踪的对象将在该QJSEngine 的析构函数中被删除。因此,如果两个不同引擎中具有JavaScriptOwnership的对象之间存在JavaScript引用,而其中一个引擎被删除,则这些引用将失效。此选项与QScriptEngine::ScriptOwnership类似。 |
通常情况下,应用程序无需显式设置对象的所有权。JavaScript 内存管理器会使用启发式算法来设置默认所有权。默认情况下,由 JavaScript 内存管理器创建的对象具有 JavaScriptOwnership。 例外情况是调用 `QQmlComponent::create()` 或 `QQmlComponent::beginCreate()` 创建的根对象,它们默认具有 `CppOwnership`。这些根级对象的所有权被视为已转移给 C++ 调用方。
非由 JavaScript 内存管理器创建的对象默认具有 CppOwnership。例外情况是 C++ 方法调用返回的对象;其所有权将被设置为 JavaScriptOwnership。这仅适用于显式调用Q_INVOKABLE 方法或插槽的情况,而不适用于属性获取器的调用。
调用setObjectOwnership() 会覆盖默认所有权。
另请参阅 “数据所有权”。
属性文档
uiLanguage : QString
该属性用于存储用户界面字符串翻译所使用的语言
该属性存储用于用户界面字符串翻译的语言名称。当引擎上安装了QJSEngine::TranslationExtension 时,该属性将作为Qt.uiLanguage 进行读写。在QQmlEngine 的实例中,该属性始终可见。
您可以自由设置该值并在绑定中使用它。建议在应用程序中安装翻译器后再进行设置。按惯例,空字符串表示不打算对源代码中使用的语言进行翻译。
访问函数:
| QString | uiLanguage() const |
| void | setUiLanguage(const QString &language) |
通知器信号:
| void | uiLanguageChanged() |
成员函数文档
QJSEngine::QJSEngine()
创建一个 QJSEngine 对象。
globalObject() 的初始化使其具有ECMA-262 第 15.1 节中描述的属性。
[explicit] QJSEngine::QJSEngine(QObject *parent)
根据给定的parent ,构建一个QJSEngine对象。
globalObject() 的初始化将使其具有ECMA-262 第 15.1 节中所述的属性。
[override virtual noexcept] QJSEngine::~QJSEngine()
销毁此QJSEngine 。
在QJSEngine 销毁过程中,持久化JS堆中的垃圾不会被回收。如果您需要释放所有内存,请在销毁QJSEngine 之前手动调用collectGarbage()。
[since Qt 6.1] QJSValue QJSEngine::catchError()
如果当前有未处理的异常,则捕获该异常并将其作为QJSValue 返回;否则,将返回未定义值QJSValue 。调用此方法后,hasError()将返回false 。
该函数在 Qt 6.1 中引入。
template <typename From, typename To> To QJSEngine::coerceValue(const From &from)
返回将给定的from 转换为模板类型To 后的结果。该转换遵循JavaScript语义。这些语义与qvariant_cast 的语义不同。在JavaScript等效类型之间存在许多隐式转换,而qvariant_cast 默认不会执行这些转换。此方法是本类中所有其他转换方法的泛化实现。
另请参阅 fromVariant()、qvariant_cast()、fromScriptValue() 以及toScriptValue()。
void QJSEngine::collectGarbage()
运行垃圾回收器。
垃圾回收器将通过定位并销毁脚本环境中已不可达的对象,从而尝试回收内存。
通常您无需调用此函数;当QJSEngine 判断有必要执行垃圾回收时(即创建了一定数量的新对象时),垃圾回收器会自动被调用。不过,您可以调用此函数,以显式要求尽快执行垃圾回收。
QJSValue QJSEngine::evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1, QStringList *exceptionStackTrace = nullptr)
评估表达式 `program`,将 `lineNumber ` 作为基准数值,并返回评估结果。
脚本代码将在全局对象的上下文中进行求值。
注意:若需 在 QML 上下文中进行求值,请改用 `QQmlExpression `。
program 的求值可能会在引擎中引发exception ;在这种情况下,返回值将是抛出的异常(通常是一个Error 对象;请参阅QJSValue::isError())。
lineNumber 用于指定program 的起始行号;引擎报告的与该评估相关的行号信息将基于此参数。 例如,如果program 包含两行代码,且第二行语句引发了脚本异常,则异常行号为lineNumber 加1。若未指定起始行号,行号将从1开始计数。
fileName 用于错误报告。例如,在错误对象中,如果通过此函数提供了文件名,则可通过“fileName”属性访问该文件名。
exceptionStackTrace 用于报告是否抛出了未捕获的异常。若向QStringList 传递一个非空指针,当脚本抛出未处理的异常时,该指针将指向“堆栈帧消息”列表;否则,将指向空列表。堆栈帧消息的格式为:函数名:行号:列号:文件名
注意:在 某些情况下(例如原生函数),函数名和文件名可能为空,行号和列号可能为 -1。
注意:如果 抛出了异常,且异常值不是 Error 实例(即QJSValue::isError() 返回false ),则仍会返回该异常值。请使用exceptionStackTrace->isEmpty() 来区分该值是正常返回值还是异常返回值。
另请参阅 QQmlExpression::evaluate 。
template <typename T> T QJSEngine::fromManagedValue(const QJSManagedValue &value)
返回将给定的value 转换为模板类型T 后的结果。
另请参阅 toManagedValue() 和coerceValue()。
template <typename T> T QJSEngine::fromPrimitiveValue(const QJSPrimitiveValue &value)
返回将给定的value 转换为模板类型T 后的结果。
由于QJSPrimitiveValue 只能包含int、bool、double、QString 以及JavaScript中null 和undefined 的等效类型,因此若请求其他类型,系统将进行强制转换。
另请参阅 toPrimitiveValue() 和coerceValue()。
template <typename T> T QJSEngine::fromScriptValue(const QJSValue &value)
返回将给定的value 转换为模板类型T 后的结果。
另请参阅 toScriptValue() 和coerceValue()。
template <typename T> T QJSEngine::fromVariant(const QVariant &value)
返回将给定的value 转换为模板类型T 的结果。该转换遵循 JavaScript 的语义。这些语义与qvariant_cast 的语义不同。在 JavaScript 等效类型之间存在许多隐式转换,但qvariant_cast 默认不会执行这些转换。
另请参阅 coerceValue()、fromScriptValue() 和qvariant_cast()。
QJSValue QJSEngine::globalObject() const
返回该引擎的全局对象。
默认情况下,全局对象包含属于ECMA-262 标准的内置对象,例如 Math、Date 和 String。此外,您可以设置全局对象的属性,以便将自定义扩展提供给所有脚本代码使用。 脚本代码中的非局部变量将被创建为全局对象的属性,全局代码中的局部变量也是如此。
[since Qt 6.1] bool QJSEngine::hasError() const
如果上次 JavaScript 执行引发了异常,或者调用了 `throwError()`,则返回 `true `;否则返回 `false`。请注意,`evaluate()` 会捕获评估代码中抛出的任何异常。
该函数在 Qt 6.1 中引入。
QJSValue QJSEngine::importModule(const QString &fileName)
导入位于fileName 的模块,并返回一个模块命名空间对象,该对象将所有导出的变量、常量和函数作为属性包含其中。
如果这是该模块在引擎中首次被导入,则会从本地文件系统或 Qt 资源系统中指定的位置加载该文件,并将其作为 ECMAScript 模块进行解析。该文件应采用 UTF-8 编码。
后续导入同一模块时,将返回先前导入的实例。模块是单例,并在引擎销毁前一直存在。
指定的fileName 将在内部通过QFileInfo::canonicalFilePath()进行规范化处理。这意味着,即使使用不同的相对路径多次导入磁盘上的同一文件,该文件也只会加载一次。
注意:如果在 加载模块期间抛出异常,返回值将是该异常(通常是一个Error 对象;参见QJSValue::isError())。
另请参阅 registerModule()。
void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSValue &object = QJSValue())
安装 JavaScriptextensions ,以添加标准 ECMAScript 实现中不具备的功能。
这些扩展将安装在指定的 `object` 上;若未指定对象,则安装在 `Global Object ` 上。
可以通过将枚举值作为 `OR` 参数来一次性安装多个扩展:
另请参阅 Extension 。
bool QJSEngine::isInterrupted() const
返回当前 JavaScript 执行是否已被中断。
另请参阅 ` setInterrupted()`。
QJSValue QJSEngine::newArray(uint length = 0)
创建一个属于 Array 类的 JavaScript 对象,其length 为给定值。
另请参阅 newObject()。
QJSValue QJSEngine::newErrorObject(QJSValue::ErrorType errorType, const QString &message = QString())
创建一个属于 Error 类的 JavaScript 对象,其错误消息为message 。
创建的对象的原型将为errorType 。
另请参阅 newObject()、throwError() 和QJSValue::isError()。
QJSValue QJSEngine::newObject()
创建一个属于 Object 类的 JavaScript 对象。
创建的对象的原型将设置为 Object 原型对象。
另请参阅 newArray() 和QJSValue::setProperty()。
template <typename T> QJSValue QJSEngine::newQMetaObject()
创建一个 JavaScript 对象,该对象封装了与类 `T` 关联的静态 `QMetaObject `。
另请参阅 newQObject() 和QObject Integration 。
QJSValue QJSEngine::newQMetaObject(const QMetaObject *metaObject)
创建一个 JavaScript 对象,该对象封装了给定的QMetaObject 。metaObject 的生命周期必须长于脚本引擎。建议仅将此方法用于静态元对象。
当作为构造函数调用时,将创建该类的一个新实例。只有由Q_INVOKABLE 公开的构造函数才可在脚本引擎中访问。
另请参阅 newQObject() 和QObject Integration 。
QJSValue QJSEngine::newQObject(QObject *object)
创建一个 JavaScript 对象,该对象使用JavaScriptOwnership 将给定的QObject object 进行封装。
object 的信号与插槽、属性及子节点均可作为创建的QJSValue 的属性使用。
如果 `object ` 是空指针,则该函数返回空值。当 `object ` 已被排入删除队列或其析构函数正在运行时,同样会返回空值。
如果已为object 的类(或其父类,递归地)注册了默认原型,则新脚本对象的原型将被设置为该默认原型。
如果给定的object 在引擎控制范围之外被删除,则任何尝试通过JavaScript封装对象(无论是脚本代码还是C++)访问已被删除的QObject 成员的行为,都将导致script exception 异常。
另请参阅 QJSValue::toQObject()。
[since 6.2] QJSValue QJSEngine::newSymbol(const QString &name)
创建一个类为 Symbol 的 JavaScript 对象,其值为name 。
所创建对象的原型将是 Symbol 原型对象。
该函数在 Qt 6.2 中引入。
另请参阅 newObject()。
[static] QJSEngine::ObjectOwnership QJSEngine::objectOwnership(QObject *object)
返回object 的所有权。
另请参阅 setObjectOwnership() 和QJSEngine::ObjectOwnership 。
bool QJSEngine::registerModule(const QString &moduleName, const QJSValue &value)
注册一个QJSValue 以作为模块。调用此函数后,所有导入moduleName 的模块都将导入value 的值,而非从文件系统加载moduleName 。
任何有效的 `QJSValue ` 均可进行注册,但命名导出(即 `import { name } from "info"`)将被视为对象的成员,因此默认导出必须通过 `QJSEngine` 的 `newXYZ` 方法之一创建。
由于这允许导入文件系统中不存在的模块,脚本应用程序可以利用此功能提供内置模块,类似于 Node.js。
成功时返回 `true `,否则返回 `false `。
注意: QJSValue value 只有在被其他模块使用时才会被 调用或读取。这意味着此时没有代码需要评估,因此直到其他模块在尝试加载该模块时抛出异常,否则不会出现任何错误。
警告:当 模块被注册时 ,引擎会评估并快照 `value ` 的属性,以确定将导出哪些内容。 对于被包装的 `QObject`,这意味着其属性仅被读取一次,后续对这些属性的修改在从 JavaScript 访问时将不会反映出来。如果您的 `QObject ` 包含在模块注册后属性值会发生变化的属性,请勿直接注册 `QObject `。而是将其包装在另一个对象中:
// C++ setup
QJSValue container = engine.newObject();
container.setProperty("instance", engine.newQObject(&myDynamicObject));
engine.registerModule("api.mjs", container);
// JavaScript usage
import {instance as Api} from "api.mjs"
// ...
console.log(Api.dynamicProperty)另请参阅 importModule()。
void QJSEngine::setInterrupted(bool interrupted)
中断或重新启用 JavaScript 执行。
如果interrupted 的值为true ,则该引擎执行的任何JavaScript都会立即中止,并返回一个错误对象,直到再次调用此函数且interrupted 的值设置为false 为止。
该函数是线程安全的。您可以从另一个线程调用它,例如,以中断 JavaScript 中的无限循环。
另请参阅 isInterrupted()。
[static] void QJSEngine::setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership)
设置 `object` 的 `ownership ` 属性。
只要对象仍有父对象,即使没有任何引用指向它,具有JavaScriptOwnership 的对象也不会被垃圾回收。
另请参阅 objectOwnership() 和QJSEngine::ObjectOwnership 。
[since Qt 5.12] void QJSEngine::throwError(const QString &message)
抛出一个带有给定message 的运行时错误(异常)。
该方法是 JavaScript 中 `throw() ` 表达式的 C++ 对应实现。它使 C++ 代码能够向 `QJSEngine` 报告运行时错误。因此,它仅应由通过 `QJSEngine` 由 JavaScript 函数调用的 C++ 代码调用。
当从 C++ 返回时,引擎将中断正常的执行流程,并调用下一个预先注册的异常处理程序,同时传递一个包含给定message 的错误对象。该错误对象将指向 JavaScript 调用栈中最高层上下文的位置;具体而言,它将具有lineNumber 、fileName 和stack 这些属性。这些属性在Script Exceptions 中有详细说明。
在下面的示例中,FileAccess.cpp中的一个 C++ 方法在qmlFile.qml中调用readFileAsText() 的位置抛出一个错误:
// qmlFile.qml
function someFunction() {
...
var text = FileAccess.readFileAsText("/path/to/file.txt");
}// FileAccess.cpp
// Assuming that FileAccess is a QObject-derived class that has been
// registered as a singleton type and provides an invokable method
// readFileAsText()
QJSValue FileAccess::readFileAsText(const QString & filePath) {
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
jsEngine->throwError(file.errorString());
return QString();
}
...
return content;
}也可以在 JavaScript 中捕获抛出的错误:
// qmlFile.qml
function someFunction() {
...
var text;
try {
text = FileAccess.readFileAsText("/path/to/file.txt");
} catch (error) {
console.warn("In " + error.fileName + ":" + "error.lineNumber" +
": " + error.message);
}
}如果您需要更具体的运行时错误来描述异常,可以使用throwError(QJSValue::ErrorType errorType, const QString &message) 的重载。
该函数在 Qt 5.12 中引入。
另请参阅 Script Exceptions 。
[since 6.1] void QJSEngine::throwError(const QJSValue &error)
抛出一个预先构建的运行时error (异常)。通过这种方式,您可以使用newErrorObject()来创建该错误,并根据需要对其进行自定义。
该函数重载了QJSEngine::throwError()。
该函数在 Qt 6.1 中引入。
另请参阅 Script Exceptions 和newErrorObject()。
[since Qt 5.12] void QJSEngine::throwError(QJSValue::ErrorType errorType, const QString &message = QString())
抛出一个运行时错误(异常),其errorType 和message 参数为给定值。
// Assuming that DataEntry is a QObject-derived class that has been
// registered as a singleton type and provides an invokable method
// setAge().
void DataEntry::setAge(int age) {
if (age < 0 || age > 200) {
jsEngine->throwError(QJSValue::RangeError,
"Age must be between 0 and 200");
}
...
}此函数重载了QJSEngine::throwError()。
该函数在 Qt 5.12 中引入。
另请参阅 Script Exceptions 和newErrorObject()。
template <typename T> QJSManagedValue QJSEngine::toManagedValue(const T &value)
创建一个QJSManagedValue ,其value 为给定值。
另请参阅 fromManagedValue() 和coerceValue()。
template <typename T> QJSPrimitiveValue QJSEngine::toPrimitiveValue(const T &value)
创建一个QJSPrimitiveValue ,其value 为给定值。
由于QJSPrimitiveValue 只能容纳int、bool、double、QString ,以及JavaScript中null 和undefined 的等效类型,因此若传入其他类型,系统将进行强制转换。
另请参阅 fromPrimitiveValue() 和coerceValue()。
template <typename T> QJSValue QJSEngine::toScriptValue(const T &value)
创建一个QJSValue ,其value 为给定值。
另请参阅 fromScriptValue() 和coerceValue()。
相关的非成员
QJSEngine *qjsEngine(const QObject *object)
返回与 `object` 关联的 `QJSEngine `(如有)。
如果您已将QObject 暴露给JavaScript环境,并在程序后续阶段希望重新访问该对象,此函数将非常有用。它不需要您保留QJSEngine::newQObject()返回的包装器。
© 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.