QJSEngine Class
Die Klasse „QJSEngine“ bietet eine Umgebung zur Ausführung von JavaScript-Code. Mehr...
| Überschrift: | #include <QJSEngine> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
| qmake: | QT += qml |
| Erbt von: | QObject |
| Vererbt an: |
Hinweis: Alle Funktionen dieser Klasse sind reentrant.
Öffentliche Typen
| enum | Extension { TranslationExtension, ConsoleExtension, GarbageCollectionExtension, AllExtensions } |
| flags | Extensions |
| enum | ObjectOwnership { CppOwnership, JavaScriptOwnership } |
Eigenschaften
- uiLanguage : QString
Öffentliche Funktionen
| 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 |
Signale
| void | uiLanguageChanged() |
Statische öffentliche Mitglieder
| QJSEngine::ObjectOwnership | objectOwnership(QObject *object) |
| void | setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership) |
Verwandte Nicht-Mitglieder
| QJSEngine * | qjsEngine(const QObject *object) |
Ausführliche Beschreibung
Skripte bewerten
Verwenden Sie „ evaluate()“, um Skriptcode auszuführen.
evaluate() gibt ein ` QJSValue ` zurück, das das Ergebnis der Auswertung enthält. Die Klasse ` QJSValue ` stellt Funktionen zur Konvertierung des Ergebnisses in verschiedene C++-Typen bereit (z. B. ` QJSValue::toString()` und ` QJSValue::toNumber()`).
Der folgende Codeausschnitt zeigt, wie eine Skriptfunktion definiert und anschließend von C++ aus mithilfe von ` QJSValue::call()` aufgerufen werden kann:
QJSValue fun = myEngine.evaluate("(function(a, b) { return a + b; })");
QJSValueList args;
args << 1 << 2;
QJSValue threeAgain = fun.call(args);Wie aus den obigen Ausschnitten ersichtlich ist, wird ein Skript in Form einer Zeichenkette an die Engine übergeben. Eine gängige Methode zum Laden von Skripten besteht darin, den Inhalt einer Datei einzulesen und an ` evaluate()` zu übergeben:
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);Hier übergeben wir den Namen der Datei als zweites Argument an ` evaluate()`. Dies hat keinerlei Auswirkungen auf die Auswertung; das zweite Argument ist eine allgemeine Zeichenkette, die zu Debugging-Zwecken im Objekt ` Error ` gespeichert wird.
Bei umfangreicheren Funktionen empfiehlt es sich, Ihren Code und Ihre Daten in Module zu kapseln. Ein Modul ist eine Datei, die Skriptcode, Variablen usw. enthält und mithilfe von `export`-Anweisungen ihre Schnittstelle zum Rest der Anwendung beschreibt. Mithilfe von `import`-Anweisungen kann ein Modul auf Funktionen aus anderen Modulen verweisen. Dies ermöglicht den sicheren Aufbau einer skriptbasierten Anwendung aus kleineren, miteinander verbundenen Bausteinen. Im Gegensatz dazu birgt der Ansatz, ` evaluate()` zu verwenden, das Risiko, dass interne Variablen oder Funktionen aus einem ` evaluate()`-Aufruf versehentlich das globale Objekt verunreinigen und nachfolgende Auswertungen beeinträchtigen.
Das folgende Beispiel zeigt ein Modul, das Zahlen addieren kann:
export function sum(left, right)
{
return left + right
}Dieses Modul kann mit `QJSEngine::import()` geladen werden, wenn es unter dem Namen ` math.mjs` gespeichert ist:
QJSvalue module = myEngine.importModule("./math.mjs");
QJSValue sumFunction = module.property("sum");
QJSValue result = sumFunction.call(args);Module können mithilfe von Importanweisungen auch Funktionen aus anderen Modulen nutzen:
import { sum } from "./math.mjs";
export function addTwice(left, right)
{
return sum(left, right) * 2;
}Module müssen keine Dateien sein. Es kann sich auch um Werte handeln, die mit ` QJSEngine::registerModule()` registriert wurden:
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();Benannte Exporte werden unterstützt, da sie jedoch als Mitglieder eines Objekts behandelt werden, muss der Standardexport ein ECMAScript-Objekt sein. Die meisten Funktionen von „newXYZ“ in ` QJSValue ` geben ein Objekt zurück.
QJSValue name("Qt6");
QJSValue obj = myEngine.newObject();
obj.setProperty("name", name);
myEngine.registerModule("info", obj);import { name } from "info";
export function getName()
{
return name;
}Engine-Konfiguration
Die Funktion ` globalObject()` gibt das mit der Skript-Engine verknüpfte globale Objekt zurück. Auf die Eigenschaften des globalen Objekts kann von jedem Skriptcode aus zugegriffen werden (d. h., es handelt sich um globale Variablen). In der Regel möchten Sie vor der Auswertung von „Benutzer“-Skripten eine Skript-Engine konfigurieren, indem Sie dem globalen Objekt eine oder mehrere Eigenschaften hinzufügen:
myEngine.globalObject().setProperty("myNumber", 123);
...
QJSValue myNumberPlusOne = myEngine.evaluate("myNumber + 1");Das Hinzufügen benutzerdefinierter Eigenschaften zur Skriptumgebung ist eine der gängigen Methoden, um eine anwendungsspezifische Skript-API bereitzustellen. In der Regel handelt es sich bei diesen benutzerdefinierten Eigenschaften um Objekte, die mit den Funktionen ` newQObject()` oder ` newObject()` erstellt wurden.
Skript-Ausnahmen
evaluate() kann eine Skript-Ausnahme auslösen (z. B. aufgrund eines Syntaxfehlers). In diesem Fall gibt evaluate() den ausgelösten Wert zurück (in der Regel ein Error -Objekt). Verwenden Sie QJSValue::isError(), um auf Ausnahmen zu prüfen.
Um detaillierte Informationen zum Fehler zu erhalten, rufen Sie mit ` QJSValue::toString()` eine Fehlermeldung ab und verwenden Sie ` QJSValue::property()`, um die Eigenschaften des ` Error `-Objekts abzufragen. Die folgenden Eigenschaften stehen zur Verfügung:
namemessagefileNamelineNumberstack
QJSValue result = myEngine.evaluate(...);
if (result.isError())
qDebug()
<< „Unbehandelte Ausnahme in Zeile“
<< result.property("lineNumber").toInt()
<< „:“ << result.toString();Erstellung eines Skript-Objekts
Verwenden Sie ` newObject()` zum Erstellen eines JavaScript-Objekts; dies entspricht in C++ der `script`-Anweisung ` new Object()`. Sie können die objektspezifischen Funktionen unter QJSValue nutzen, um das Skript-Objekt zu bearbeiten (z. B. ` QJSValue::setProperty()`). Verwenden Sie in ähnlicher Weise ` newArray()` zum Erstellen eines JavaScript-Array-Objekts.
QObject-Integration
Verwenden Sie newQObject(), um einen Zeiger auf ein QObject (oder eine Unterklasse) zu verpacken. newQObject() gibt ein Proxy-Skript-Objekt zurück; Eigenschaften, Kinder sowie Signale und Slots des QObject stehen als Eigenschaften des Proxy-Objekts zur Verfügung. Es ist kein Bindungscode erforderlich, da dies dynamisch über das Qt-Metaobjektsystem erfolgt.
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(); // den Slot „show()“ aufrufenVerwenden Sie ` newQMetaObject()` zum Umschließen eines ` QMetaObject`; dadurch erhalten Sie eine „Skriptdarstellung“ einer auf ` QObject` basierenden Klasse. ` newQMetaObject()` gibt ein Proxy-Skriptobjekt zurück; die Enum-Werte der Klasse stehen als Eigenschaften des Proxy-Objekts zur Verfügung.
Konstruktoren, die dem Metaobjektsystem zugänglich gemacht werden (mithilfe von Q_INVOKABLE), können vom Skript aus aufgerufen werden, um eine neue QObject -Instanz mit JavaScriptOwnership zu erstellen. Beispielsweise bei folgender Klassendefinition:
class MyObject : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE MyObject() {}
};Der ` staticMetaObject ` der Klasse kann wie folgt für JavaScript freigegeben werden:
QJSValue jsMetaObject = engine.newQMetaObject(&MyObject::staticMetaObject);
engine.globalObject().setProperty("MyObject", jsMetaObject);Instanzen der Klasse können dann in JavaScript erstellt werden:
engine.evaluate("var myObject = new MyObject()");Hinweis: Derzeit werden nur Klassen unterstützt, die das Makro „ Q_OBJECT “ verwenden; es ist nicht möglich, die „ staticMetaObject “ einer „ Q_GADGET “-Klasse für JavaScript verfügbar zu machen.
Dynamische QObject-Eigenschaften
Dynamische „ QObject “-Eigenschaften werden nicht unterstützt. Der folgende Code funktioniert beispielsweise nicht:
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();Erweiterungen
QJSEngine bietet eine ECMAScript-konforme Implementierung. Standardmäßig sind bekannte Hilfsfunktionen wie die Protokollierung nicht verfügbar, können jedoch über die Funktion ` installExtensions()` installiert werden.
Siehe auch „ QJSValue“ , „Anwendungen skriptfähig machen“ und „Liste der JavaScript-Objekte und -Funktionen“.
Dokumentation zu Mitgliedstypen
enum QJSEngine::Extension
flags QJSEngine::Extensions
Diese Enumeration dient zur Angabe von Erweiterungen, die über ` installExtensions()` installiert werden sollen.
| Konstante | Wert | Beschreibung |
|---|---|---|
QJSEngine::TranslationExtension | 0x1 | Gibt an, dass Übersetzungsfunktionen (z. B. `qsTr()`) installiert werden sollen. Dadurch wird auch die Qt XML-Eigenschaft `uiLanguage ` installiert. |
QJSEngine::ConsoleExtension | 0x2 | Gibt an, dass Konsolenfunktionen (z. B. `console.log()`) installiert werden sollen. |
QJSEngine::GarbageCollectionExtension | 0x4 | Gibt an, dass Garbage-Collection-Funktionen (z. B. `gc()`) installiert werden sollen. |
QJSEngine::AllExtensions | 0xffffffff | Gibt an, dass alle Erweiterungen installiert werden sollen. |
TranslationExtension
Die Beziehung zwischen Skript-Übersetzungsfunktionen und C++-Übersetzungsfunktionen wird in der folgenden Tabelle beschrieben:
| Skriptfunktion | Entsprechende C++-Funktion |
|---|---|
| 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() |
Dieses Flag fügt dem String-Prototyp außerdem eine Funktion „ arg() “ hinzu.
Weitere Informationen finden Sie in der Dokumentation zu „Internationalisierung mit Qt “.
ConsoleExtension
Das Konsolenobjekt implementiert eine Teilmenge der Konsolen-API, die bekannte Protokollierungsfunktionen wie console.log() bereitstellt.
Die Liste der hinzugefügten Funktionen lautet wie folgt:
console.assert()console.debug()console.exception()console.info()console.log()(entspricht „console.debug()“)console.error()console.time()console.timeEnd()console.trace()console.count()console.warn()print()(entspricht `console.debug()`)
Weitere Informationen finden Sie in der Dokumentation zur Console-API.
GarbageCollectionExtension
Die Funktion „ gc() “ entspricht dem Aufruf von „ collectGarbage()“.
Der Typ „Extensions“ ist ein `typedef` für ` QFlags<Extension>`. Er speichert eine OR-Kombination von Extension-Werten.
enum QJSEngine::ObjectOwnership
„ObjectOwnership“ steuert, ob der JavaScript-Speichermanager den „ QObject “ automatisch löscht, wenn das entsprechende JavaScript-Objekt von der Engine durch die Garbage Collection entfernt wird. Es gibt zwei Optionen für die Eigentumsregelung:
| „Constant“ | Wert | Beschreibung |
|---|---|---|
QJSEngine::CppOwnership | 0 | Das Objekt gehört dem C++-Code, und der JavaScript-Speichermanager wird es niemals löschen. Die JavaScript-Methode `destroy()` kann für diese Objekte nicht verwendet werden. Diese Option ähnelt `QScriptEngine::QtOwnership`. |
QJSEngine::JavaScriptOwnership | 1 | Das Objekt gehört JavaScript. Wenn das Objekt als Rückgabewert eines Methodenaufrufs an den JavaScript-Speichermanager zurückgegeben wird, verfolgt dieser es und löscht es, sofern keine JavaScript-Referenzen mehr darauf bestehen und es kein ` QObject::parent()` aufweist. Ein Objekt, das von einem „ QJSEngine “ verfolgt wird, wird während des Destruktors dieses „ QJSEngine “ gelöscht. Daher sind JavaScript-Referenzen zwischen Objekten mit „JavaScriptOwnership“ aus zwei verschiedenen Engines ungültig, wenn eine dieser Engines gelöscht wird. Diese Option ähnelt QScriptEngine::ScriptOwnership. |
Im Allgemeinen muss eine Anwendung die Eigentumsrechte eines Objekts nicht explizit festlegen. Der JavaScript-Speichermanager verwendet eine Heuristik, um die Standard-Eigentumsrechte festzulegen. Standardmäßig verfügt ein vom JavaScript-Speichermanager erstelltes Objekt über „JavaScriptOwnership“. Eine Ausnahme bilden die durch den Aufruf von ` QQmlComponent::create()` oder ` QQmlComponent::beginCreate()` erstellten Root-Objekte, die standardmäßig `CppOwnership` besitzen. Die Eigentumsrechte an diesen Root-Objekten gelten als auf den C++-Aufrufer übertragen.
Objekte, die nicht vom JavaScript-Speichermanager erstellt wurden, haben standardmäßig „CppOwnership“. Eine Ausnahme bilden Objekte, die von C++-Methodenaufrufen zurückgegeben werden; deren Eigentumsrechte werden auf „JavaScriptOwnership“ gesetzt. Dies gilt nur für explizite Aufrufe von „ Q_INVOKABLE “-Methoden oder -Slots, nicht jedoch für Aufrufe von Eigenschafts-Getter-Methoden.
Der Aufruf von „ setObjectOwnership()“ überschreibt die Standard-Eigentumsrechte.
Siehe auch „Datenbesitz“.
Dokumentation zu Eigenschaften
uiLanguage : QString
Diese Eigenschaft enthält die Sprache, die für die Übersetzung von Zeichenfolgen der Benutzeroberfläche verwendet werden soll
Diese Eigenschaft enthält den Namen der Sprache, die für die Übersetzung von Zeichenfolgen der Benutzeroberfläche verwendet werden soll. Sie steht zum Lesen und Schreiben als „ Qt.uiLanguage “ zur Verfügung, wenn das „ QJSEngine::TranslationExtension “ auf der Engine installiert ist. In Instanzen von „ QQmlEngine “ ist sie stets verfügbar.
Sie können den Wert frei festlegen und in Bindungen verwenden. Es wird empfohlen, ihn nach der Installation von Übersetzern in Ihrer Anwendung festzulegen. Gemäß Konvention bedeutet eine leere Zeichenkette, dass keine Übersetzung aus der im Quellcode verwendeten Sprache vorgesehen ist.
Zugriffsfunktionen:
| QString | uiLanguage() const |
| void | setUiLanguage(const QString &language) |
Notifier-Signal:
| void | uiLanguageChanged() |
Dokumentation der Member-Funktionen
QJSEngine::QJSEngine()
Erstellt ein QJSEngine-Objekt.
Die Methode „ globalObject()“ wird so initialisiert, dass sie die in ECMA-262, Abschnitt 15.1 beschriebenen Eigenschaften aufweist.
[explicit] QJSEngine::QJSEngine(QObject *parent)
Erstellt ein QJSEngine-Objekt mit dem angegebenen „ parent “.
Das ` globalObject()` wird so initialisiert, dass es die in ECMA-262, Abschnitt 15.1 beschriebenen Eigenschaften aufweist.
[override virtual noexcept] QJSEngine::~QJSEngine()
Löscht diesen „ QJSEngine “.
Beim Löschen von „ QJSEngine “ wird der persistente JS-Heap nicht von Garbage Collection bereinigt. Wenn der gesamte Speicher freigegeben werden soll, rufen Sie „ collectGarbage()“ manuell unmittelbar vor dem Löschen von „ QJSEngine “ auf.
[since Qt 6.1] QJSValue QJSEngine::catchError()
Wenn derzeit eine Ausnahme aussteht, wird diese abgefangen und als ` QJSValue` zurückgegeben. Andernfalls wird „undefiniert“ als ` QJSValue` zurückgegeben. Nach dem Aufruf dieser Methode gibt ` hasError()` ` false` zurück.
Diese Funktion wurde in Qt 6.1 eingeführt.
template <typename From, typename To> To QJSEngine::coerceValue(const From &from)
Gibt den angegebenen „ from “ zurück, der in den Vorlagentyp „ To “ konvertiert wurde. Die Konvertierung erfolgt gemäß der JavaScript-Semantik. Diese unterscheidet sich von der Semantik von „ qvariant_cast “. Es gibt eine Reihe impliziter Konvertierungen zwischen JavaScript-äquivalenten Typen, die von „ qvariant_cast “ standardmäßig nicht durchgeführt werden. Diese Methode ist eine Verallgemeinerung aller anderen Konvertierungsmethoden dieser Klasse.
Siehe auch fromVariant(), qvariant_cast(), fromScriptValue() und toScriptValue().
void QJSEngine::collectGarbage()
Führt den Garbage Collector aus.
Der Garbage Collector versucht, Speicherplatz freizugeben, indem er Objekte aufspürt und entsorgt, die in der Skriptumgebung nicht mehr erreichbar sind.
Normalerweise müssen Sie diese Funktion nicht aufrufen; der Garbage Collector wird automatisch aufgerufen, wenn der „ QJSEngine “ entscheidet, dass dies sinnvoll ist (d. h. wenn eine bestimmte Anzahl neuer Objekte erstellt wurde). Sie können diese Funktion jedoch aufrufen, um explizit zu verlangen, dass die Garbage Collection so bald wie möglich durchgeführt wird.
Siehe auch Garbage Collection und gc().
QJSValue QJSEngine::evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1, QStringList *exceptionStackTrace = nullptr)
Wertet „ program “ aus, wobei „ lineNumber “ als Basiszahl verwendet wird, und gibt das Ergebnis der Auswertung zurück.
Der Skriptcode wird im Kontext des globalen Objekts ausgewertet.
Hinweis: Wenn Sie die Auswertung innerhalb eines QML-Kontexts durchführen müssen, verwenden Sie stattdessen ` QQmlExpression `.
Die Auswertung von ` program ` kann in der Engine zu einer ` exception ` führen; in diesem Fall ist der Rückgabewert die ausgelöste Ausnahme (in der Regel ein ` Error `-Objekt; siehe ` QJSValue::isError()`).
lineNumber wird verwendet, um eine Startzeilennummer für ` program` anzugeben; die von der Engine gemeldeten Zeilennummernangaben, die sich auf diese Auswertung beziehen, basieren auf diesem Argument. Wenn beispielsweise „ program “ aus zwei Codezeilen besteht und die Anweisung in der zweiten Zeile eine Skript-Ausnahme auslöst, wäre die Zeilennummer der Ausnahme „ lineNumber “ plus eins. Wenn keine Startzeilennummer angegeben wird, beginnen die Zeilennummern bei 1.
fileName wird für die Fehlerberichterstattung verwendet. In Fehlerobjekten ist der Dateiname beispielsweise über die Eigenschaft „fileName“ zugänglich, sofern er dieser Funktion übergeben wurde.
exceptionStackTrace wird verwendet, um zu melden, ob eine nicht abgefangene Ausnahme ausgelöst wurde. Wenn Sie einen nicht-null-Zeiger auf einen „ QStringList “ an die Funktion übergeben, wird dieser auf eine Liste von „Stackframe-Meldungen“ gesetzt, falls das Skript eine unbehandelte Ausnahme ausgelöst hat, andernfalls auf eine leere Liste. Eine Stackframe-Meldung hat das Format „Funktionsname:Zeilennummer:Spalte:Dateiname“.
Hinweis: In einigen Fällen, z. B. bei nativen Funktionen, können der Funktionsname und der Dateiname leer sein und die Zeilennummer sowie die Spalte den Wert -1 annehmen.
Hinweis: Wenn eine Ausnahme ausgelöst wurde und der Ausnahmewert keine `Error`-Instanz ist (d. h., ` QJSValue::isError()` gibt ` false` zurück), wird der Ausnahmewert dennoch zurückgegeben. Verwenden Sie ` exceptionStackTrace->isEmpty() `, um zu unterscheiden, ob es sich bei dem Wert um einen normalen oder einen Ausnahmerückgabewert handelt.
Siehe auch ` QQmlExpression::evaluate`.
template <typename T> T QJSEngine::fromManagedValue(const QJSManagedValue &value)
Gibt das angegebene ` value ` zurück, das in den Vorlagentyp ` T` konvertiert wurde.
Siehe auch toManagedValue() und coerceValue().
template <typename T> T QJSEngine::fromPrimitiveValue(const QJSPrimitiveValue &value)
Gibt die angegebene „ value “-Variable zurück, die in den Vorlagentyp „ T “ konvertiert wurde.
Da ` QJSPrimitiveValue ` nur Werte vom Typ `int`, `bool`, `double`, ` QString` sowie die Entsprechungen der JavaScript-Typen ` null ` und ` undefined` enthalten kann, wird der Wert aggressiv umgewandelt, wenn Sie einen anderen Typ anfordern.
Siehe auch toPrimitiveValue() und coerceValue().
template <typename T> T QJSEngine::fromScriptValue(const QJSValue &value)
Gibt das angegebene ` value ` zurück, das in den Vorlagentyp ` T` konvertiert wurde.
Siehe auch toScriptValue() und coerceValue().
template <typename T> T QJSEngine::fromVariant(const QVariant &value)
Gibt das angegebene ` value ` zurück, das in den Vorlagentyp ` T` konvertiert wurde. Die Konvertierung erfolgt gemäß der JavaScript-Semantik. Diese unterscheidet sich von der Semantik von ` qvariant_cast`. Es gibt eine Reihe impliziter Konvertierungen zwischen JavaScript-äquivalenten Typen, die von ` qvariant_cast ` standardmäßig nicht durchgeführt werden.
Siehe auch coerceValue(), fromScriptValue() und qvariant_cast().
QJSValue QJSEngine::globalObject() const
Gibt das globale Objekt dieser Engine zurück.
Standardmäßig enthält das globale Objekt die in ECMA-262 integrierten Objekte wie „Math“, „Date“ und „String“. Darüber hinaus können Sie Eigenschaften des globalen Objekts festlegen, um Ihre eigenen Erweiterungen für den gesamten Skriptcode verfügbar zu machen. Nicht-lokale Variablen im Skriptcode werden als Eigenschaften des globalen Objekts angelegt, ebenso wie lokale Variablen im globalen Code.
[since Qt 6.1] bool QJSEngine::hasError() const
Gibt „ true “ zurück, wenn die letzte JavaScript-Ausführung zu einer Ausnahme geführt hat oder wenn „ throwError()“ aufgerufen wurde. Andernfalls wird „ false “ zurückgegeben. Beachten Sie, dass „ evaluate()“ alle im ausgewerteten Code ausgelösten Ausnahmen abfängt.
Diese Funktion wurde in Qt 6.1 eingeführt.
QJSValue QJSEngine::importModule(const QString &fileName)
Importiert das Modul unter fileName und gibt ein Modul-Namespace-Objekt zurück, das alle exportierten Variablen, Konstanten und Funktionen als Eigenschaften enthält.
Wenn das Modul zum ersten Mal in die Engine importiert wird, wird die Datei vom angegebenen Speicherort entweder im lokalen Dateisystem oder im Qt-Ressourcensystem geladen und als ECMAScript-Modul ausgewertet. Die Datei sollte im UTF-8-Textformat kodiert sein.
Bei nachfolgenden Importen desselben Moduls wird die zuvor importierte Instanz zurückgegeben. Module sind Singletons und bleiben so lange bestehen, bis die Engine zerstört wird.
Der angegebene „ fileName “ wird intern mithilfe von „ QFileInfo::canonicalFilePath()“ normalisiert. Das bedeutet, dass mehrere Importe derselben Datei auf der Festplatte über unterschiedliche relative Pfade dazu führen, dass die Datei nur einmal geladen wird.
Hinweis: Wird beim Laden des Moduls eine Ausnahme ausgelöst, ist der Rückgabewert die Ausnahme (in der Regel ein ` Error `-Objekt; siehe ` QJSValue::isError()`).
Siehe auch registerModule().
void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSValue &object = QJSValue())
Installiert JavaScript- extensions, um Funktionen hinzuzufügen, die in einer Standard-ECMAScript-Implementierung nicht verfügbar sind.
Die Erweiterungen werden auf dem angegebenen ` object` installiert oder, falls kein Objekt angegeben ist, auf dem ` Global Object `.
Es können mehrere Erweiterungen gleichzeitig installiert werden, indem die Enum-Werte als „ OR “ angegeben werden:
Siehe auch ` Extension`.
bool QJSEngine::isInterrupted() const
Gibt zurück, ob die Ausführung von JavaScript derzeit unterbrochen ist.
Siehe auch ` setInterrupted()`.
QJSValue QJSEngine::newArray(uint length = 0)
Erstellt ein JavaScript-Objekt der Klasse „Array“ mit dem angegebenen Array length.
Siehe auch ` newObject()`.
QJSValue QJSEngine::newErrorObject(QJSValue::ErrorType errorType, const QString &message = QString())
Erstellt ein JavaScript-Objekt der Klasse „Error“ mit der Fehlermeldung „ message “.
Der Prototyp des erstellten Objekts lautet „ errorType “.
Siehe auch „ newObject()“, „ throwError()“ und „ QJSValue::isError()“.
QJSValue QJSEngine::newObject()
Erstellt ein JavaScript-Objekt der Klasse „Object“.
Der Prototyp des erstellten Objekts ist das Prototyp-Objekt „Object“.
Siehe auch „ newArray()“ und „ QJSValue::setProperty()“.
template <typename T> QJSValue QJSEngine::newQMetaObject()
Erstellt ein JavaScript-Objekt, das die statische Methode „ QMetaObject “ umschließt, die der Klasse „ T “ zugeordnet ist.
Siehe auch „ newQObject()“ und „ QObject Integration “.
QJSValue QJSEngine::newQMetaObject(const QMetaObject *metaObject)
Erstellt ein JavaScript-Objekt, das das angegebene „ QMetaObject “ umschließt. Das „ metaObject “ muss länger bestehen bleiben als die Skript-Engine. Es wird empfohlen, diese Methode nur mit statischen Metaobjekten zu verwenden.
Wird die Methode als Konstruktor aufgerufen, wird eine neue Instanz der Klasse erstellt. Nur die von ` Q_INVOKABLE ` bereitgestellten Konstruktoren sind von der Skript-Engine aus sichtbar.
Siehe auch newQObject() und QObject Integration.
QJSValue QJSEngine::newQObject(QObject *object)
Erstellt ein JavaScript-Objekt, das das angegebene „ QObject “ object mithilfe von „ JavaScriptOwnership “ umschließt.
Signale und Slots, Eigenschaften und untergeordnete Elemente von ` object ` stehen als Eigenschaften des erstellten ` QJSValue` zur Verfügung.
Ist ` object ` ein Null-Zeiger, gibt diese Funktion einen Nullwert zurück. Dasselbe gilt, wenn ` object ` zum Löschen vorgesehen ist oder wenn sein Destruktor bereits ausgeführt wird.
Wenn für die Klasse von ` object` (oder deren Oberklasse, rekursiv) ein Standardprototyp registriert wurde, wird der Prototyp des neuen Skript-Objekts auf diesen Standardprototyp gesetzt.
Wird das angegebene „ object “ außerhalb der Kontrolle der Engine gelöscht, führt jeder Versuch, über das JavaScript-Wrapper-Objekt (entweder per Skriptcode oder C++) auf die Mitglieder des gelöschten „ QObject “ zuzugreifen, zu einem „ script exception “.
Siehe auch ` QJSValue::toQObject()`.
[since 6.2] QJSValue QJSEngine::newSymbol(const QString &name)
Erstellt ein JavaScript-Objekt der Klasse „Symbol“ mit dem Wert „ name “.
Der Prototyp des erstellten Objekts ist das Symbol-Prototypobjekt.
Diese Funktion wurde in Qt 6.2 eingeführt.
Siehe auch ` newObject()`.
[static] QJSEngine::ObjectOwnership QJSEngine::objectOwnership(QObject *object)
Gibt die Eigentumsrechte an „ object “ zurück.
Siehe auch „ setObjectOwnership()“ und „ QJSEngine::ObjectOwnership “.
bool QJSEngine::registerModule(const QString &moduleName, const QJSValue &value)
Registriert eine ` QJSValue ` als Modul. Nach dem Aufruf dieser Funktion importieren alle Module, die ` moduleName ` importieren, den Wert von ` value `, anstatt ` moduleName ` aus dem Dateisystem zu laden.
Jedes gültige ` QJSValue ` kann registriert werden, aber benannte Exporte (z. B. ` import { name } from "info"`) werden als Elemente eines Objekts behandelt, sodass der Standardexport mit einer der `newXYZ`-Methoden von ` QJSEngine` erstellt werden muss.
Da dadurch Module importiert werden können, die im Dateisystem nicht vorhanden sind, können Skriptanwendungen dies nutzen, um integrierte Module bereitzustellen, ähnlich wie bei Node.js.
Gibt bei Erfolg ` true ` zurück, andernfalls ` false `.
Hinweis: Die ` QJSValue ` ` value ` wird erst aufgerufen bzw. gelesen, wenn sie von einem anderen Modul verwendet wird. Das bedeutet, dass kein Code ausgewertet wird, sodass keine Fehler angezeigt werden, bis ein anderes Modul beim Versuch, dieses Modul zu laden, eine Ausnahme auslöst.
Warnung: Der Versuch , auf einen benannten Export aus einem „ QJSValue “ zuzugreifen, der kein Objekt ist, löst eine „ exception “ aus.
Warnung: Wenn ein Modul registriert wird, wertet die Engine die Eigenschaften von ` value ` aus und erstellt einen Snapshot davon, um zu bestimmen, was exportiert wird. Bei einem „wrapped“ QObject bedeutet dies, dass seine Eigenschaften nur einmal gelesen werden und nachfolgende Änderungen an diesen Eigenschaften beim Zugriff aus JavaScript nicht berücksichtigt werden. Wenn Ihr „ QObject “ Eigenschaften enthält, deren Werte sich nach der Modulregistrierung ändern, registrieren Sie das „ QObject “ nicht direkt. Verpacken Sie es stattdessen in ein anderes Objekt:
// 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)Siehe auch importModule().
void QJSEngine::setInterrupted(bool interrupted)
Unterbricht die Ausführung von JavaScript oder aktiviert sie wieder.
Wenn „ interrupted “ auf „ true “ gesetzt ist, wird jedes von dieser Engine ausgeführte JavaScript sofort abgebrochen und ein Fehlerobjekt zurückgegeben, bis diese Funktion erneut mit dem Wert „ false “ für „ interrupted “ aufgerufen wird.
Diese Funktion ist threadsicher. Sie können sie aus einem anderen Thread aufrufen, um beispielsweise eine Endlosschleife in JavaScript zu unterbrechen.
Siehe auch ` isInterrupted()`.
[static] void QJSEngine::setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership)
Setzt die Eigenschaft „ ownership “ von „ object “.
Ein Objekt mit „ JavaScriptOwnership “ wird nicht von der Garbage Collection entfernt, solange es noch einen übergeordneten Eintrag hat, selbst wenn keine Verweise darauf vorhanden sind.
Siehe auch „ objectOwnership()“ und „ QJSEngine::ObjectOwnership “.
[since Qt 5.12] void QJSEngine::throwError(const QString &message)
Löst einen Laufzeitfehler (Ausnahme) mit dem angegebenen ` message` aus.
Diese Methode ist das C++-Äquivalent zu einem ` throw() `-Ausdruck in JavaScript. Sie ermöglicht es C++-Code, Laufzeitfehler an ` QJSEngine` zu melden. Daher sollte sie nur aus C++-Code aufgerufen werden, der von einer JavaScript-Funktion über ` QJSEngine` aufgerufen wurde.
Bei der Rückkehr aus C++ unterbricht die Engine den normalen Ausführungsfluss und ruft den nächsten vorab registrierten Ausnahmebehandler mit einem Fehlerobjekt auf, das den angegebenen ` message` enthält. Das Fehlerobjekt verweist auf die Position des obersten Kontexts im JavaScript-Aufrufstapel; konkret verfügt es über die Eigenschaften ` lineNumber`, ` fileName ` und ` stack`. Diese Eigenschaften sind unter Script Exceptions beschrieben.
Im folgenden Beispiel löst eine C++-Methode in „FileAccess.cpp“ einen Fehler in „qmlFile.qml“ an der Stelle aus, an der „ readFileAsText() “ aufgerufen wird:
// 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;
}Es ist auch möglich, den ausgelösten Fehler in JavaScript abzufangen:
// 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);
}
}Wenn Sie einen spezifischeren Laufzeitfehler benötigen, um eine Ausnahme zu beschreiben, können Sie die Überladung von ` throwError(QJSValue::ErrorType errorType, const QString &message)` verwenden.
Diese Funktion wurde in Qt 5.12 eingeführt.
Siehe auch ` Script Exceptions`.
[since 6.1] void QJSEngine::throwError(const QJSValue &error)
Löst eine vorgefertigte Laufzeit- error (Ausnahme) aus. Auf diese Weise können Sie mit ` newErrorObject()` den Fehler erzeugen und ihn nach Bedarf anpassen.
Diese Funktion überlädt ` QJSEngine::throwError()`.
Diese Funktion wurde in Qt 6.1 eingeführt.
Siehe auch ` Script Exceptions ` und ` newErrorObject()`.
[since Qt 5.12] void QJSEngine::throwError(QJSValue::ErrorType errorType, const QString &message = QString())
Löst einen Laufzeitfehler (Ausnahme) mit den angegebenen Werten für ` errorType ` und ` message` aus.
// 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");
}
...
}Diese Funktion überlädt ` QJSEngine::throwError()`.
Diese Funktion wurde in Qt 5.12 eingeführt.
Siehe auch ` Script Exceptions ` und ` newErrorObject()`.
template <typename T> QJSManagedValue QJSEngine::toManagedValue(const T &value)
Erstellt eine „ QJSManagedValue “ mit dem angegebenen „ value “.
Siehe auch „ fromManagedValue()“ und „ coerceValue()“.
template <typename T> QJSPrimitiveValue QJSEngine::toPrimitiveValue(const T &value)
Erstellt ein „ QJSPrimitiveValue “-Objekt mit dem angegebenen „ value “.
Da ` QJSPrimitiveValue ` nur die Typen `int`, `bool`, `double`, ` QString` sowie die Entsprechungen der JavaScript-Typen ` null ` und ` undefined` enthalten kann, wird der Wert aggressiv umgewandelt, wenn Sie einen anderen Typ übergeben.
Siehe auch fromPrimitiveValue() und coerceValue().
template <typename T> QJSValue QJSEngine::toScriptValue(const T &value)
Erstellt eine „ QJSValue “ mit dem angegebenen „ value “.
Siehe auch fromScriptValue() und coerceValue().
Verwandte Nicht-Mitglieder
QJSEngine *qjsEngine(const QObject *object)
Gibt das mit object verknüpfte QJSEngine zurück, sofern vorhanden.
Diese Funktion ist nützlich, wenn Sie ein „ QObject “ für die JavaScript-Umgebung freigegeben haben und später in Ihrem Programm wieder darauf zugreifen möchten. Sie müssen den von QJSEngine::newQObject() zurückgegebenen Wrapper nicht aufbewahren.
© 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.