QJSEngine Class

QJSEngine 类为评估 JavaScript 代码提供了一个环境。更多

头文件: #include <QJSEngine>
CMake: find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml
继承: QObject
继承于:

QQmlEngine

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

公共类型

enum Extension { TranslationExtension, ConsoleExtension, GarbageCollectionExtension, AllExtensions }
flags Extensions
enum ObjectOwnership { CppOwnership, JavaScriptOwnership }

属性

公共职能

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

信号

静态公共成员

QJSEngine::ObjectOwnership objectOwnership(QObject *object)
void setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership)
QJSEngine *qjsEngine(const QObject *object)

详细说明

评估脚本

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

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

evaluate() 返回一个保存评估结果的QJSValueQJSValue 类提供了将结果转换为各种 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 语句使用其他模块的功能:

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
QJSValueresult=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 = newQPushButton;QJSValuescriptButton=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()");

注意: 目前只支持使用Q_OBJECT 宏的类,无法将Q_GADGET 类的staticMetaObject 暴露给 JavaScript。

动态 QObject 属性

不支持动态QObject 属性。例如,以下代码将无法运行:

QJSEngine引擎;QObject*myQObject = newQObject(); myQObject->setProperty("dynamicProperty", 3);QJSValuemyScriptQObject=engine.newQObject(myQObject); engine.globalObject().setProperty("myObject",myScriptQObject);
qDebug() << engine.evaluate("myObject.dynamicProperty").toInt();

扩展

QJSEngine 提供了兼容 ECMAScript 的实现。默认情况下,我们熟悉的实用程序(如日志记录)不可用,但可以通过installExtensions() 函数安装。

另请参阅 QJSValue使应用程序可编写脚本,以及JavaScript 对象函数列表

成员类型文档

枚举 QJSEngine::Extension
flags QJSEngine::Extensions

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

常量说明
QJSEngine::TranslationExtension0x1表示应安装翻译函数(例如qsTr() )。这也会安装 Qt XML.uiLanguage 属性。
QJSEngine::ConsoleExtension0x2表示应安装控制台函数(例如console.log() )。
QJSEngine::GarbageCollectionExtension0x4表示应安装垃圾回收功能(例如gc() )。
QJSEngine::AllExtensions0xffffffff表示应安装所有扩展。

翻译扩展

下表描述了脚本翻译函数与 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 国际化文档。

控制台扩展

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文档。

垃圾收集扩展

gc() 函数等同于调用collectGarbage() 。

Extensions 类型是QFlags<Extension> 的类型定义。它存储扩展值的 OR 组合。

enum QJSEngine::ObjectOwnership

ObjectOwnership 控制着 JavaScript 内存管理器是否会在相应的 JavaScript 对象被引擎回收垃圾时自动销毁QObject 。两个所有权选项是

常量说明
QJSEngine::CppOwnership0对象为 C++ 代码所有,JavaScript 内存管理器永远不会删除它。JavaScript destroy() 方法不能用于这些对象。此选项类似于 QScriptEngine::QtOwnership。
QJSEngine::JavaScriptOwnership1对象归 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)

Notifier 信号:

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)

返回已转换为模板类型To 的给定from 。转换以 JavaScript 语义进行。这与qvariant_cast 的语义不同。qvariant_cast 默认不执行 JavaScript 等价类型之间的一些隐式转换。该方法是对该类中所有其他转换方法的概括。

另请参见 fromVariant(),qvariant_cast(),fromScriptValue() 和toScriptValue().

void QJSEngine::collectGarbage()

运行垃圾回收器。

垃圾回收器将尝试通过定位和处理脚本环境中无法再访问的对象来回收内存。

通常情况下,您不需要调用此函数;当QJSEngine 认为应该调用垃圾收集器时(即创建了一定数量的新对象时),垃圾收集器就会自动调用。不过,您也可以调用该函数来明确要求尽快执行垃圾回收。

另请参阅 垃圾回收gc()。

QJSValue QJSEngine::evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1, QStringList *exceptionStackTrace = nullptr)

使用lineNumber 作为基准行号,对program 进行求值,并返回求值结果。

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

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

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

lineNumber 用于指定 的起始行号;引擎报告的与本次评估相关的行号信息将以该参数为基础。例如,如果 由两行代码组成,而第二行的语句会导致脚本异常,则异常行号为 加一。如果没有指定起始行号,行号将以 1 为基准。program program lineNumber

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

exceptionStackTrace 用于报告是否抛出了未捕获异常。如果将指向 的非空指针传递给它,那么如果脚本抛出了未处理异常,它就会将该指针设置为 "栈帧消息 "列表,否则就会设置为空列表。堆栈帧消息的格式为:函数名:行号:列:文件名QStringList

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

注: 如果出现异常,且异常值不是 Error 实例(即QJSValue::isError() 返回false ),则仍将返回异常值。请使用exceptionStackTrace->isEmpty() 来区分是正常返回值还是异常返回值。

另请参阅 QQmlExpression::evaluate

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

返回转换为模板类型T 的给定value

另请参阅 toManagedValue() 和coerceValue()。

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

返回转换为模板类型T 的给定value

由于QJSPrimitiveValue 只能容纳 int、bool、double、QString 以及 JavaScriptnullundefined 的等价类型,因此如果请求任何其他类型,该值将被强制性强制转换。

另请参见 toPrimitiveValue() 和coerceValue()。

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

返回转换为模板类型T 的给定value

另请参阅 toScriptValue() 和coerceValue()。

template <typename T> T QJSEngine::fromVariant(const QVariant &value)

返回已转换为模板类型T 的给定value 。转换以 JavaScript 语义进行。这与qvariant_cast 的语义不同。qvariant_cast 默认不执行 JavaScript 等价类型之间的隐式转换。

另请参见 coerceValue(),fromScriptValue(), 和qvariant_cast().

QJSValue QJSEngine::globalObject() const

返回该引擎的全局对象。

默认情况下,全局对象包含ECMA-262 的内置对象,如数学、日期和字符串。此外,您还可以设置全局对象的属性,以便在所有脚本代码中使用自己的扩展。脚本代码中的非本地变量将创建为全局对象的属性,全局代码中的本地变量也将创建为全局对象的属性。

[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-ing 枚举值,可以同时安装多个扩展:

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

另请参见 Extension

bool 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())

创建一个类为 Error 的 JavaScript 对象,错误信息为message

创建对象的原型是errorType

另请参阅 newObject()、throwError() 和QJSValue::isError()。

QJSValue QJSEngine::newObject()

创建一个对象类的 JavaScript 对象。

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

另请参阅 newArray() 和QJSValue::setProperty()。

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

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

另请参阅 newQObject() 和QObject Integration

QJSValue QJSEngine::newQMetaObject(const QMetaObject *metaObject)

创建封装给定QMetaObject 的 JavaScript 对象metaObject 的寿命必须超过脚本引擎的寿命。建议仅对静态元对象使用此方法。

作为构造函数调用时,将创建该类的一个新实例。只有Q_INVOKABLE 公开的构造函数才能在脚本引擎中可见。

另请参阅 newQObject() 和QObject Integration

QJSValue QJSEngine::newQObject(QObject *object)

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

object 的信号和插槽、属性和子对象可作为创建的QJSValue 的属性使用。

如果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 在被其他模块使用之前不会被调用或读取。这意味着没有代码需要评估,因此不会出现错误,直到其他模块在尝试加载该模块时出现异常。

警告: 试图从QJSValue 访问命名的导出,如果该导出不是对象,则会触发exception

另请参阅 importModule() 。

void QJSEngine::setInterrupted(bool interrupted)

中断或重新启用 JavaScript 的执行。

如果interrupted 的值为true ,则该引擎执行的任何 JavaScript 都会立即中止,并返回一个错误对象,直到再次调用该函数时interrupted 的值为false

该函数是线程安全的。您可以在不同的线程中调用该函数,以中断 JavaScript 中的无限循环。

另请参见 isInterrupted()。

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

设置objectownership

只要JavaScriptOwnership 对象仍有父对象,即使没有引用,也不会被垃圾回收。

另请参阅 objectOwnership() 和QJSEngine::ObjectOwnership

[since Qt 5.12] void QJSEngine::throwError(const QString &message)

使用给定的message 抛出运行时错误(异常)。

该方法在 C++ 中对应于 JavaScript 中的throw() 表达式。它能让 C++ 代码向QJSEngine 报告运行时错误。因此,只有通过QJSEngine 由 JavaScript 函数调用的 C++ 代码才能调用该方法。

从 C++ 返回时,引擎将中断正常的执行流程,并调用下一个预先注册的异常处理程序,同时调用包含给定message 的错误对象。错误对象将指向 JavaScript 调用堆栈中最顶层上下文的位置;具体来说,它的属性为lineNumberfileNamestack 。这些属性在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)

该函数重载 throwError()。

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

该函数在 Qt 6.1 中引入。

另请参阅 Script ExceptionsnewErrorObject()。

[since 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 中引入。

另请参阅 Script ExceptionsnewErrorObject()。

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

用给定的value 创建QJSManagedValue

另请参阅 fromManagedValue() 和coerceValue() 。

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

使用给定的value 创建QJSPrimitiveValue

由于QJSPrimitiveValue 只能容纳 int、bool、double、QString 以及 JavaScriptnullundefined 的等价类型,因此如果传递任何其他类型,值将被强制强制。

另请参见 fromPrimitiveValue() 和coerceValue()。

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

用给定的value 创建QJSValue

另请参阅 fromScriptValue() 和coerceValue()。

相关非会员

QJSEngine *qjsEngine(const QObject *object)

返回与object 相关联的QJSEngine (如果有)。

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

© 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.