QJSEngine 类

QJSEngine 类提供了一个执行 JavaScript 代码的环境。 更多信息...

头文件 #include <QJSEngine>
CMakefind_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmakeQT += qml
继承自 QObject
继承

QQmlEngine

注意:本类中所有函数都是可重入的

公共类型

枚举Extension { TranslationExtension, ConsoleExtension, GarbageCollectionExtension, AllExtensions }
标志Extensions
枚举ObjectOwnership { CppOwnership, JavaScriptOwnership }

属性

公共函数

QJSEngine()
QJSEngine(QObject *parent)
虚拟~QJSEngine() override
(since Qt 6.1) QJSValuecatchError()
coerceValue(const From &from)
voidcollectGarbage()
QJSValueevaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1, QStringList *exceptionStackTrace = nullptr)
TfromManagedValue(const QJSManagedValue &value)
TfromPrimitiveValue(const QJSPrimitiveValue &value)
TfromScriptValue(const QJSValue &value)
TfromVariant(const QVariant &value)
QJSValueglobalObject() const
(since Qt 6.1) boolhasError() const
QJSValueimportModule(const QString &fileName)
voidinstallExtensions(QJSEngine::Extensions extensions, const QJSValue &object = QJSValue())
boolisInterrupted() const
QJSValuenewArray(uint length = 0)
QJSValuenewErrorObject(QJSValue::ErrorType errorType, const QString &message = QString())
QJSValuenewObject()
QJSValuenewQMetaObject(const QMetaObject *metaObject)
QJSValuenewQMetaObject()
QJSValuenewQObject(QObject *object)
(since 6.2) QJSValuenewSymbol(const QString &name)
boolregisterModule(const QString &moduleName, const QJSValue &value)
voidsetInterrupted(bool interrupted)
voidsetUiLanguage(const QString &language)
(自 Qt 5.12 开始) voidthrowError(const QString &message)
(自 Qt 5.12 开始) voidthrowError(QJSValue::ErrorType errorType, const QString &message = QString())
(自 6.1 版本开始) voidthrowError(const QJSValue &error)
QJSManagedValuetoManagedValue(const T &value)
QJSPrimitiveValuetoPrimitiveValue(const T &value)
QJSValuetoScriptValue(const T &value)
QStringuiLanguage() const

信号

静态公共成员

QJSEngine::ObjectOwnershipobjectOwnership(QObject *object)
voidsetObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership)
QJSEngine *qjsEngine(const QObject *object)

详细描述

评估脚本

使用 evaluate() 来评估脚本代码。

QJSEngine myEngine;
QJSValue three = myEngine.evaluate("1 + 2");

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 对象中。

对于较大片的功能,您可能希望将代码和数据封装到模块中。模块是一个包含脚本代码、变量等的文件,并使用导出语句描述其与应用程序其余部分的接口。通过导入语句,模块可以引用来自其他模块的功能。这允许以安全的方式从较小的互联构建块构建脚本化的应用程序。相比之下,使用 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 { 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 对象的属性。以下属性可用:

  • name
  • message
  • fileName
  • lineNumber
  • stack
QJSValue result = myEngine.evaluate(...);
if (result.isError())
    qDebug()
            << "Uncaught exception at line"
            << result.property("lineNumber").toInt()
            << ":" << result.toString();

脚本对象创建

使用 newObject() 创建 JavaScript 对象;这是 C++ 中脚本语句 new Object() 的等效函数。您可以使用 QJSValue 中的对象特定功能来操作脚本对象(例如,QJSValue::setProperty())。同样,使用 newArray() 创建 JavaScript 数组对象。

QObject集成

使用 newQObject() 包装 QObject(或子类)指针。newQObject() 返回一个代理脚本对象;QObject 的属性、子对象以及信号和槽在代理对象的属性中可用。不需要绑定代码,因为它是通过动态使用 Qt 元对象系统实现的。

QPushButton *button = new QPushButton;
QJSValue scriptButton = myEngine.newQObject(button);
myEngine.globalObject().setProperty("button", scriptButton);

myEngine.evaluate("button.checkable = true");

qDebug() << scriptButton.property("checkable").toBool();
scriptButton.property("show").call(); // call the show() slot

使用 newQMetaObject() 包装 QMetaObject;这为您提供了一个基于 QObject 的类的 "脚本表示"。newQMetaObject() 返回一个代理脚本对象;类的枚举值作为代理对象的属性可用。

公开给元对象系统(使用 Q_INVOKABLE)的构造函数可以从脚本调用以创建一个新的 QObject 实例,具有 JavaScriptOwnership。例如,给定以下类定义

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()");

注意:目前仅支持使用 Q_OBJECT 宏的类;无法将 Q_GADGET 类的 staticMetaObject 公开给 JavaScript。

动态 QObject 属性

不支持动态 QObject 属性。例如,以下代码将不会工作

QJSEngine engine;

QObject *myQObject = new QObject();
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对象和函数列表

成员类型文档

枚举 QJSEngine::Extension
标志 QJSEngine::Extensions

此枚举用于指定通过installExtensions()函数安装的扩展。

常量描述
QJSEngine::TranslationExtension0x1指示应该安装翻译函数(如qsTr())并安装Qt.uiLanguage属性。
QJSEngine::ConsoleExtension0x2指示应该安装控制台函数(如console.log())。
QJSEngine::GarbageCollectionExtension0x4指示应该安装垃圾收集函数(如gc())。
QJSEngine::AllExtensions0xffffffff指示应安装所有扩展。

TranslationExtension

脚本翻译函数和C++翻译函数之间的关系在以下表中描述

此标志还向字符串原型添加了arg()函数。

有关更多信息,请参阅使用Qt进行国际化文档。

ConsoleExtension

console对象实现了Console 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()

有关更多信息,请参阅Console API文档。

GarbageCollectionExtension

gc()函数相当于调用collectGarbage()。

Extensions类型是对QFlags<Extension>的typedef。它存储了Extension值的或组合。

枚举 QJSEngine::ObjectOwnership

ObjectOwnership控制JavaScript内存管理器是否自动销毁对应的JavaScript对象时QObject。有两种所有权选项

常量描述
QJSEngine::CppOwnership0对此对象的所有权属于C++代码,JavaScript内存管理器永远不会删除它。不能在这些对象上使用JavaScript destroy()方法。此选项类似于QScriptEngine::QtOwnership。
QJSEngine::JavaScriptOwnership1对象归JavaScript所有。当对象作为方法调用的返回值返回到JavaScript内存管理器时,JavaScript内存管理器会跟踪它,如果没有剩余的JavaScript引用,并且它没有QObject::parent(),则会将其删除。被一个QJSEngine跟踪的对象将在该QJSEngine的析构函数期间被删除。因此,如果其中一个引擎被删除,来自两个不同引擎的对象之间的JavaScript引用将无效。此选项类似于QScriptEngine::ScriptOwnership。

通常,应用程序不必明确设置对象的所有权。JavaScript内存管理器使用一种启发式方法来设置默认的所有权。默认情况下,由JavaScript内存管理器创建的对象具有JavaScriptOwnership。例外情况是由调用QQmlComponent::create()或QQmlComponent::beginCreate()创建的根对象,它们默认具有CppOwnership。这些根级对象的所有权被认为已转移到了C++调用者。

不是由JavaScript内存管理器创建的对象默认具有CppOwnership。例外情况是来自C++方法调用的对象;它们的所有权将设置为JavaScriptOwnership。这仅适用于对Q_INVOKABLE方法或槽的显式调用,但不适用于属性getter调用。

调用setObjectOwnership()将覆盖默认的所有权。

另请参阅数据所有权

属性文档

uiLanguage : QString

此属性包含用于翻译用户界面字符串的语言

此属性包含用于用户界面字符串翻译的语言名称。在引擎安装QJSEngine::TranslationExtension的情况下,它作为Qt.uiLanguage公开读取和写入。在QQmlEngine的实例中始终公开。

您可以自由设置值并在绑定中使用它。建议在您的应用程序中安装翻译器后再设置它。按照惯例,空字符串表示无意从源代码使用的语言进行翻译。

访问函数

QStringuiLanguage() const
voidsetUiLanguage(const QString &language)

通知信号

voiduiLanguageChanged()

成员函数文档

QJSEngine::QJSEngine()

构建一个QJSEngine对象。

globalObject()初始化为具有ECMA-262第15.1节中描述的属性。

[显式] QJSEngine::QJSEngine(QObject *parent)

使用指定的parent构建一个QJSEngine对象。

globalObject()初始化为具有ECMA-262第15.1节中描述的属性。

[覆盖虚拟noexcept] QJSEngine::~QJSEngine()

销毁此QJSEngine

QJSEngine销毁期间不会从持久JS堆中收集垃圾。如果您需要释放所有内存,请在销毁QJSEngine之前手动调用collectGarbage()。

[自Qt 6.1起] QJSValue QJSEngine::catchError()

如果当前有异常待处理,则捕获异常并以QJSValue的形式返回它。否则以QJSValue返回undefined。调用此方法后,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)

使用lineNumber作为基准行号,评估program并返回评估的结果。

脚本代码将在全局对象上下文中进行评估。

注意:如果您需要在QML上下文中进行评估,请使用QQmlExpression代替。

program的评估可能会在引擎中引起异常;在这种情况下,返回值将是抛出的异常(通常是Error对象;请参阅QJSValue::isError)。

lineNumber用于指定program的起始行号;与此次评估相关的引擎报告的行号信息将基于此参数。例如,如果program由两行代码组成,且第二行的语句引发脚本异常,则异常行号将是lineNumber加一。如果没有指定起始行号,则行号从1开始。

fileName用于错误报告。例如,如果此函数提供了文件名,错误对象中的文件名可以通过"fileName"属性访问。

exceptionStackTrace用于报告是否抛出了未捕获的异常。如果您向其中传递一个指向QStringList的非空指针,则如果脚本抛出了未处理的异常,它将设置为其的"stackframe messages"列表,否则为空列表。栈帧消息的格式为函数名:行号:列:文件名

注意:在某些情况下,例如对于本地函数,函数名称和文件名可能为空,行号和列号可以是 -1。

注意:如果在抛出异常且异常值不是 Error 实例(即 QJSValue::isError() 返回 false),则异常值仍然会被返回。使用 exceptionStackTrace->isEmpty() 来区分该值是正常返回值还是异常返回值。

参阅:QQmlExpression::evaluate

模板 <typename T> T QJSEngine::fromManagedValue(const QJSManagedValue &value)

返回将给定的 value 转换为模板类型 T 的结果。

参阅:toManagedValue() 和 coerceValue

模板 <typename T> T QJSEngine::fromPrimitiveValue(const QJSPrimitiveValue &value)

返回将给定的 value 转换为模板类型 T 的结果。

由于 QJSPrimitiveValue 只能容纳 int、bool、double、QString 以及 JavaScript 中 nullundefined 的等价物,如果你请求其他类型,值将被强制转换。

参阅:toPrimitiveValue() 和 coerceValue

模板 <typename T> T QJSEngine::fromScriptValue(const QJSValue &value)

返回将给定的 value 转换为模板类型 T 的结果。

参阅:toScriptValue() 和 coerceValue

模板 <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。此外,你可以设置全局对象的属性,以便所有脚本代码都可以使用你自己的扩展。脚本代码中的非局部变量将作为全局对象的属性创建,以及作为全局代码中的局部变量。

[自(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())

安装 JavaScript extensions 以添加标准 ECMAScript 实现中不存在的功能。

扩展将安装在指定的 object 上,如果没有指定对象,则安装在 Global Object 上。

可以通过对枚举值执行 OR 运算来一次性安装多个扩展。

installExtensions(QJSEngine::TranslationExtension | QJSEngine::ConsoleExtension);

另请参阅:Extension

QJSValue QJSEngine::isInterrupted() const

返回 JavaScript 执行是否当前中断。

另请参阅:setInterrupted

QJSValue QJSEngine::newArray(uint length = 0)

创建具有给定 length 的类 Array 的 JavaScript 对象。

另请参阅:newObject

QJSValue QJSEngine::newErrorObject(QJSValue::ErrorType errorType, const QString &message = QString())

创建一个将 message 作为错误消息的类 Error 的 JavaScript 对象。

创建的对象的基类将是 errorType

另请参阅:newObjectthrowErrorQJSValue::isError

QJSValue QJSEngine::newObject()

创建一个类 Object 的 JavaScript 对象。

创建的对象的基类将是 Object 原型对象。

另请参阅:newArrayQJSValue::setProperty

QJSValue QJSEngine::newQMetaObject(const QMetaObject *metaObject)

创建一个JavaScript对象,该对象封装了指定的 QMetaObject。该 metaObject 必须比脚本引擎寿命更长。建议仅使用此方法与静态元对象。

当作为构造函数调用时,将创建该类的新实例。只有通过 Q_INVOKABLE 披露的构造函数才可以从脚本引擎中看到。

另请参阅 newQObject() 和 QObject集成

template <typename T> QJSValue QJSEngine::newQMetaObject()

创建一个JavaScript对象,该对象封装了与类 T 关联的静态 QMetaObject

另请参阅 newQObject() 和 QObject集成

QJSValue QJSEngine::newQObject(QObject *object)

创建一个JavaScript对象,该对象封装了指定的 QObject object,使用 JavaScriptOwnership

object 的信号和槽、属性和子对象都可作为创建的 QJSValue 的属性访问。

如果 object 是一个空指针,则此函数返回空值。

如果 object 的类(或其基类,递归)已注册默认原型,则新脚本对象的原型将设置为默认原型。

如果给定的 object 在引擎的控制之外被删除,则通过JavaScript封装对象(无论是通过脚本代码还是C++)访问已删除的 QObject 成员将导致 脚本异常

另请参阅 QJSValue::toQObject

[since 6.2] QJSValue QJSEngine::newSymbol(const QString &name)

创建一个具有值 name 的Symbol类的JavaScript对象。

创建的对象的原型将是Symbol原型对象。

此功能在Qt 6.2中引入。

另请参阅:newObject

[静态] 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 的新XYZ方法之一来创建默认导出。

因为允许导入文件系统上不存在的模块,脚本应用程序可以使用此功能提供内置模块,类似于Node.js。

成功时返回true,否则返回false

注意:在另一个模块使用之前,不会调用或读取QJSValue。这意味着没有代码要评估,因此只有在尝试加载此模块时线程其他模块抛出异常,才会看到错误。

警告:尝试从一个非对象的QJSValue访问命名导出将触发一个异常

另请参阅:importModule()。

void QJSEngine::setInterrupted(bool interrupted)

中断或重新启用JavaScript执行。

如果interruptedtrue,此引擎执行的所有JavaScript将立即终止并返回一个错误对象,直到再次调用此函数且interrupted的值为false

此函数是线程安全的。您可以从不同的线程调用它以中断,例如,JavaScript中的无限循环。

另请参阅:isInterrupted()。

[static] void QJSEngine::setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership)

设置object所有权

只要对象仍有父对象,即使没有引用它,具有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调用栈中顶层上下文的地址;具体来说,它将具有lineNumberfileNamestack属性。这些属性在脚本异常中描述。

在以下示例中,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中引入的。

另请参阅脚本异常

[自 Qt 5.12 开始] void QJSEngine::throwError(QJSValue::ErrorType errorType, const QString &message = QString())

此函数重载了 throwError()。

抛出带有给定 errorTypemessage 的运行时错误(异常)。

// 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");
  }
  ...
}

此函数是在Qt 5.12中引入的。

另请参阅脚本异常newErrorObject

[自 6.1 版本开始] void QJSEngine::throwError(const QJSValue &error)

此函数重载了 throwError()。

抛出一个预先构建的运行时 error(异常)。这样你可以使用 newErrorObject() 创建错误并根据需要对其进行自定义。

此函数是在Qt 6.1中引入的。

另请参阅脚本异常newErrorObject

模板 <typename T> QJSManagedValue QJSEngine::toManagedValue(const T &value)

创建一个带有给定 valueQJSManagedValue

另请参阅fromManagedValue() 和 coerceValue

模板 <typename T> QJSPrimitiveValue QJSEngine::toPrimitiveValue(const T &value)

创建一个带有给定 valueQJSPrimitiveValue

由于 QJSPrimitiveValue 只能持有 int、bool、double、QString 以及 JavaScript nullundefined 的等效值,如果传入其他类型,则值将被强制转换为。

另请参阅fromPrimitiveValue() 和 coerceValue

模板 <typename T> QJSValue QJSEngine::toScriptValue(const T &value)

创建一个带有给定 valueQJSValue

另请参阅fromScriptValue() 和 coerceValue

相关非成员函数

QJSEngine *qjsEngine(const QObject *object)

返回与 object 相关联的 QJSEngine,如果有的话。

如果您将 QObject 暴露给 JavaScript 环境,并且稍后在您的程序中想重新获得访问,此函数非常有用。它不需要您保留从 QJSEngine::newQObject() 返回的包装器。

© 2024 Qt 公司 Ltd。此处包含的文档贡献版权归各自的拥有者。本处的文档是在自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款下提供的。Qt 及其相应标志是芬兰及/或世界上其他国家的 Qt 公司的商标。所有其他商标均为各自所有者的财产。