QJSEngine Class

Die Klasse QJSEngine bietet eine Umgebung zur Auswertung von JavaScript-Code. Mehr...

Kopfzeile: #include <QJSEngine>
CMake: find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml
Vererbt: QObject
Vererbt von:

QQmlEngine

Hinweis: Alle Funktionen in dieser Klasse sind reentrant.

Öffentliche Typen

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

Eigenschaften

Ö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

Statische öffentliche Mitglieder

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

Detaillierte Beschreibung

Skripte auswerten

Verwenden Sie evaluate(), um Skriptcode auszuwerten.

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

evaluate() gibt ein QJSValue zurück, das das Ergebnis der Auswertung enthält. Die Klasse QJSValue bietet Funktionen zur Umwandlung des Ergebnisses in verschiedene C++-Typen (z. B. QJSValue::toString() und QJSValue::toNumber()).

Der folgende Codeschnipsel zeigt, wie eine Skriptfunktion definiert und dann von C++ aus mit 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 Schnipseln ersichtlich ist, wird ein Skript der Engine in Form einer Zeichenkette zur Verfügung gestellt. Eine gängige Methode zum Laden von Skripten besteht darin, den Inhalt einer Datei zu lesen 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 größeren Funktionseinheiten sollten Sie Ihren Code und Ihre Daten in Modulen kapseln. Ein Modul ist eine Datei, die Skriptcode, Variablen usw. enthält und Exportanweisungen verwendet, um seine Schnittstelle zum Rest der Anwendung zu beschreiben. Mit Hilfe von Import-Anweisungen kann ein Modul auf Funktionen aus anderen Modulen verweisen. Auf diese Weise lässt sich eine geskriptete Anwendung aus kleineren, zusammenhängenden Bausteinen auf sichere Weise aufbauen. 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 beeinflussen.

Das folgende Beispiel zeigt einen Baustein, der 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 auch Funktionen von anderen Modulen mit Hilfe von import-Anweisungen nutzen:

import { sum } from "./math.mjs";
export function addTwice(left, right)
{
    return sum(left, right) * 2;
}

Module müssen keine Dateien sein. Sie können Werte sein, die mit QJSEngine::registerModule() registriert werden:

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, aber da sie als Mitglieder eines Objekts behandelt werden, muss der Standard-Export ein ECMAScript-Objekt sein. Die meisten der newXYZ-Funktionen 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;
}

Motor-Konfiguration

Die Funktion globalObject() gibt das mit der Script-Engine verbundene Global Object zurück. Auf die Eigenschaften des Global Object kann von jedem Skriptcode aus zugegriffen werden (d. h. es handelt sich um globale Variablen). Bevor Sie "Benutzer"-Skripte auswerten, möchten Sie in der Regel eine Skript-Engine konfigurieren, indem Sie eine oder mehrere Eigenschaften zum Global Object hinzufügen:

myEngine.globalObject().setProperty("myNumber", 123);
...
QJSValue myNumberPlusOne = myEngine.evaluate("myNumber + 1");

Das Hinzufügen von benutzerdefinierten Eigenschaften zur Skripting-Umgebung ist eines der Standardmittel, um eine anwendungsspezifische Skripting-API bereitzustellen. Normalerweise sind diese benutzerdefinierten Eigenschaften Objekte, die mit den Funktionen newQObject() oder newObject() erstellt werden.

Skript-Ausnahmen

evaluate() kann eine Skript-Ausnahme auslösen (z. B. aufgrund eines Syntaxfehlers). Wenn dies der Fall ist, gibt evaluate() den Wert zurück, der ausgelöst wurde (normalerweise ein Error Objekt). Verwenden Sie QJSValue::isError(), um auf Ausnahmen zu prüfen.

Für detaillierte Informationen über den Fehler verwenden Sie QJSValue::toString(), um eine Fehlermeldung zu erhalten, und verwenden Sie QJSValue::property(), um die Eigenschaften des Error Objekts abzufragen. Die folgenden Eigenschaften sind verfügbar:

  • name
  • message
  • fileName
  • lineNumber
  • stack
QJSValue result = myEngine.evaluate(...);if (result.isError())    qDebug()
           << "Ungefangene Ausnahme bei Zeile"<< result.property("lineNumber").toInt() << ": "<< result.toString();

Erstellung von Skript-Objekten

Verwenden Sie newObject(), um ein JavaScript-Objekt zu erstellen; dies ist das C++-Äquivalent der Skriptanweisung new Object(). Sie können die objektspezifischen Funktionen in QJSValue verwenden, um das Skriptobjekt zu manipulieren (z. B. QJSValue::setProperty()). In ähnlicher Weise verwenden Sie newArray(), um ein JavaScript-Array-Objekt zu erstellen.

QObject-Integration

Verwenden Sie newQObject(), um einen Zeiger von QObject (oder einer Unterklasse) zu umhüllen. newQObject() gibt ein Proxy-Skriptobjekt zurück; Eigenschaften, Kinder, Signale und Slots von QObject sind als Eigenschaften des Proxy-Objekts verfügbar. Es wird kein Bindungscode benötigt, da dies dynamisch über das Qt-Metaobjektsystem geschieht.

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(); // Aufruf des show()-Slots

Verwenden Sie newQMetaObject(), um eine QMetaObject zu umhüllen; so erhalten Sie eine "Skriptdarstellung" einer QObject-basierten Klasse. newQMetaObject() gibt ein Proxy-Skriptobjekt zurück; Enum-Werte der Klasse sind als Eigenschaften des Proxy-Objekts verfügbar.

Konstruktoren, die dem Meta-Objektsystem (mit Q_INVOKABLE) ausgesetzt sind, können vom Skript aus aufgerufen werden, um eine neue QObject Instanz mit JavaScriptOwnership zu erzeugen. Ein Beispiel ist die folgende Klassendefinition:

class MyObject : public QObject
{
    Q_OBJECT

public:
    Q_INVOKABLE MyObject() {}
};

Die staticMetaObject für die Klasse kann wie folgt an JavaScript übergeben 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 in JavaScript zu verwenden.

Dynamische QObject-Eigenschaften

Dynamische QObject Eigenschaften werden nicht unterstützt. Zum Beispiel wird der folgende Code nicht funktionieren:

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 Dienstprogramme wie die Protokollierung nicht verfügbar, sie können jedoch über die Funktion installExtensions() installiert werden.

Siehe auch QJSValue, Anwendungen skriptfähig machen, und Liste der JavaScript-Objekte und -Funktionen.

Dokumentation der Mitgliedstypen

enum QJSEngine::Extension
flags QJSEngine::Extensions

Dieses Enum wird verwendet, um Erweiterungen anzugeben, die über installExtensions() installiert werden sollen.

KonstanteWertBeschreibung
QJSEngine::TranslationExtension0x1Gibt an, dass Übersetzungsfunktionen (z.B.qsTr()) installiert werden sollen. Dadurch wird auch die Eigenschaft Qt.uiLanguage installiert.
QJSEngine::ConsoleExtension0x2Zeigt an, dass Konsolenfunktionen (z.B.console.log()) installiert werden sollen.
QJSEngine::GarbageCollectionExtension0x4Gibt an, dass Garbage-Collection-Funktionen (z.B.gc()) installiert werden sollen.
QJSEngine::AllExtensions0xffffffffZeigt an, dass alle Erweiterungen installiert werden sollen.

ÜbersetzungErweiterung

Die Beziehung zwischen Skript-Übersetzungsfunktionen und C++-Übersetzungsfunktionen wird in der folgenden Tabelle beschrieben:

Skript FunktionEntsprechende 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 auch eine arg() Funktion zum String Prototyp hinzu.

Weitere Informationen finden Sie in der Dokumentation Internationalisierung mit Qt.

ConsoleExtension

Das Console-Objekt implementiert eine Teilmenge der Console-API, die bekannte Protokollierungsfunktionen wie console.log() bereitstellt.

Die Liste der hinzugefügten Funktionen ist wie folgt:

  • console.assert()
  • console.debug()
  • console.exception()
  • console.info()
  • console.log() (äquivalent zu console.debug())
  • console.error()
  • console.time()
  • console.timeEnd()
  • console.trace()
  • console.count()
  • console.warn()
  • print() (äquivalent zu console.debug())

Weitere Informationen finden Sie in der Dokumentation zur Console API.

GarbageCollectionExtension

Die Funktion gc() ist äquivalent zum Aufruf von collectGarbage().

Der Typ Extensions ist ein Typedef für QFlags<Extension>. Er speichert eine ODER-Kombination von Extensions-Werten.

enum QJSEngine::ObjectOwnership

ObjectOwnership steuert, ob der JavaScript-Speichermanager die QObject automatisch zerstört, wenn das entsprechende JavaScript-Objekt von der Engine Garbage Collected wird. Die beiden Eigentumsoptionen sind:

KonstanteWertBeschreibung
QJSEngine::CppOwnership0Das Objekt ist Eigentum von C++-Code und wird vom JavaScript-Speicher-Manager nie gelöscht. Die JavaScript-Methode destroy() kann für diese Objekte nicht verwendet werden. Diese Option ist vergleichbar mit QScriptEngine::QtOwnership.
QJSEngine::JavaScriptOwnership1Das Objekt ist Eigentum von JavaScript. Wenn das Objekt als Rückgabewert eines Methodenaufrufs an den JavaScript-Speichermanager zurückgegeben wird, verfolgt der JavaScript-Speichermanager das Objekt und löscht es, wenn es keine verbleibenden JavaScript-Referenzen auf das Objekt gibt und es keine QObject::parent() hat. Ein Objekt, das von einem QJSEngine verfolgt wird, wird im Destruktor dieses QJSEngine gelöscht. Daher sind JavaScript-Referenzen zwischen Objekten mit JavaScriptOwnership von zwei verschiedenen Engines nicht mehr gültig, wenn eine dieser Engines gelöscht wird. Diese Option ist vergleichbar mit QScriptEngine::ScriptOwnership.

Im Allgemeinen muss eine Anwendung die Eigentümerschaft eines Objekts nicht explizit festlegen. Der JavaScript-Speichermanager verwendet eine Heuristik, um die Standard-Eigentümerschaft festzulegen. Standardmäßig hat ein Objekt, das vom JavaScript-Speicher-Manager erstellt wird, JavaScriptOwnership. Eine Ausnahme bilden die Wurzelobjekte, die durch den Aufruf von QQmlComponent::create() oder QQmlComponent::beginCreate() erstellt werden und standardmäßig CppOwnership haben. Es wird davon ausgegangen, dass das Eigentum an diesen Root-Objekten auf den C++-Aufrufer übergegangen ist.

Objekte, die nicht vom JavaScript-Speichermanager erstellt werden, haben standardmäßig CppOwnership. Eine Ausnahme bilden Objekte, die von C++-Methodenaufrufen zurückgegeben werden; ihre Eigentümerschaft wird auf JavaScriptOwnership gesetzt. Dies gilt nur für explizite Aufrufe von Q_INVOKABLE -Methoden oder -Slots, nicht aber für Property-Getter-Aufrufe.

Der Aufruf von setObjectOwnership() setzt die Standard-Eigentümerschaft außer Kraft.

Siehe auch Dateneigentum.

Dokumentation der Eigenschaft

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 ist zum Lesen und Schreiben als Qt.uiLanguage verfügbar, wenn QJSEngine::TranslationExtension auf der Engine installiert ist. Sie wird immer in Instanzen von QQmlEngine angezeigt.

Sie können den Wert frei einstellen und in Bindungen verwenden. Es wird empfohlen, ihn nach der Installation von Übersetzern in Ihrer Anwendung zu setzen. Konventionell bedeutet ein leerer String, dass keine Übersetzung aus der im Quellcode verwendeten Sprache erfolgen soll.

Zugriffsfunktionen:

QString uiLanguage() const
void setUiLanguage(const QString &language)

Melder-Signal:

void uiLanguageChanged()

Member Function Dokumentation

QJSEngine::QJSEngine()

Konstruiert ein QJSEngine-Objekt.

globalObject() wird so initialisiert, dass es die in ECMA-262, Abschnitt 15.1 beschriebenen Eigenschaften besitzt.

[explicit] QJSEngine::QJSEngine(QObject *parent)

Konstruiert ein QJSEngine-Objekt mit der angegebenen parent.

Die globalObject() wird so initialisiert, dass sie die in ECMA-262, Abschnitt 15.1 beschriebenen Eigenschaften besitzt.

[override virtual noexcept] QJSEngine::~QJSEngine()

Zerstört diese QJSEngine.

Während der Zerstörung von QJSEngine wird kein Speicher aus dem persistenten JS-Heap entfernt. Wenn Sie den gesamten Speicher freigeben müssen, rufen Sie collectGarbage() manuell auf, unmittelbar bevor Sie QJSEngine zerstören.

[since Qt 6.1] QJSValue QJSEngine::catchError()

Wenn gerade eine Ausnahme ansteht, fängt sie diese ab und gibt sie als QJSValue zurück. Andernfalls wird als QJSValue undefiniert zurückgegeben. Nach dem Aufruf dieser Methode hasError() wird false zurückgegeben.

Diese Funktion wurde in Qt 6.1 eingeführt.

template <typename From, typename To> To QJSEngine::coerceValue(const From &from)

Gibt die angegebene from zurück, konvertiert in den Vorlagentyp To. Die Konvertierung erfolgt in JavaScript-Semantik. Diese unterscheiden sich von der Semantik von qvariant_cast. Es gibt eine Reihe von impliziten Konvertierungen zwischen JavaScript-äquivalenten Typen, die von qvariant_cast standardmäßig nicht durchgeführt werden. Diese Methode ist eine Verallgemeinerung aller anderen Konvertierungsmethoden in dieser Klasse.

Siehe auch fromVariant(), qvariant_cast(), fromScriptValue(), und toScriptValue().

void QJSEngine::collectGarbage()

Führt den Garbage Collector aus.

Der Garbage Collector versucht, Speicher zurückzugewinnen, indem er Objekte, die in der Skriptumgebung nicht mehr erreichbar sind, aufspürt und entsorgt.

Normalerweise brauchen Sie diese Funktion nicht aufzurufen; der Garbage Collector wird automatisch aufgerufen, wenn QJSEngine entscheidet, dass dies sinnvoll ist (d. h. wenn eine bestimmte Anzahl neuer Objekte erstellt wurde). Sie können diese Funktion jedoch auch aufrufen, um explizit anzufordern, dass die Garbage Collection so bald wie möglich durchgeführt werden soll.

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 Basiszeilennummer verwendet wird, und gibt das Ergebnis der Auswertung zurück.

Der Skriptcode wird im Kontext des globalen Objekts ausgewertet.

Hinweis: Wenn Sie eine Auswertung innerhalb eines QML-Kontextes benötigen, verwenden Sie stattdessen QQmlExpression.

Die Auswertung von program kann eine exception in der Engine auslösen; in diesem Fall ist der Rückgabewert die Ausnahme, die ausgelöst wurde (typischerweise ein Error Objekt; siehe QJSValue::isError()).

lineNumber wird verwendet, um eine Startzeilennummer für program anzugeben; Zeilennummern, die von der Engine gemeldet werden und sich auf diese Auswertung beziehen, basieren auf diesem Argument. Wenn program beispielsweise aus zwei Codezeilen besteht und die Anweisung in der zweiten Zeile eine Skriptausnahme verursacht, ist die Nummer der Ausnahmezeile lineNumber plus eins. Wenn keine Startzeilennummer angegeben wird, werden die Zeilennummern auf 1 basieren.

fileName wird für Fehlerberichte verwendet. In Fehlerobjekten ist zum Beispiel der Dateiname über die Eigenschaft "fileName" zugänglich, wenn er mit dieser Funktion angegeben wird.

exceptionStackTrace wird verwendet, um zu melden, ob eine nicht abgefangene Ausnahme ausgelöst wurde. Wenn Sie dieser Funktion einen Zeiger auf QStringList übergeben, der nicht leer ist, wird er auf eine Liste von "stackframe messages" gesetzt, wenn 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 Funktionsname und Dateiname leer sein und Zeilennummer und Spalte können -1 sein.

Hinweis: Wenn eine Ausnahme ausgelöst wurde und der Ausnahmewert keine Fehlerinstanz ist (d.h. QJSValue::isError() gibt false zurück), wird der Ausnahmewert trotzdem zurückgegeben. Verwenden Sie exceptionStackTrace->isEmpty() um zu unterscheiden, ob der Wert ein normaler oder ein außergewöhnlicher Rückgabewert war.

Siehe auch QQmlExpression::evaluate.

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

Gibt die angegebene value zurück, konvertiert in den Vorlagentyp T.

Siehe auch toManagedValue() und coerceValue().

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

Gibt den angegebenen value in den Vorlagentyp T konvertiert zurück.

Da QJSPrimitiveValue nur int, bool, double, QString und die Äquivalente von JavaScript null und undefined enthalten kann, wird der Wert aggressiv gezwungen, wenn Sie einen anderen Typ anfordern.

Siehe auch toPrimitiveValue() und coerceValue().

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

Gibt die angegebene value zurück, konvertiert in den Vorlagentyp T.

Siehe auch toScriptValue() und coerceValue().

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

Gibt die angegebene value zurück, konvertiert in den Vorlagentyp T. Die Konvertierung erfolgt in JavaScript-Semantik. Diese unterscheiden sich von der Semantik von qvariant_cast. Es gibt eine Reihe von impliziten 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 Global Object dieser Engine zurück.

Standardmäßig enthält das Global Object die eingebauten Objekte, die Teil der ECMA-262 sind, wie z. B. Math, Date und String. Zusätzlich können Sie Eigenschaften des Global Objects festlegen, um Ihre eigenen Erweiterungen für den gesamten Skriptcode verfügbar zu machen. Nichtlokale Variablen im Skriptcode werden als Eigenschaften des Globalen Objekts erstellt, 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 Exceptions 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 dies das erste Mal ist, dass das Modul 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. Es wird erwartet, dass die Datei in UTF-8-Text kodiert ist.

Nachfolgende Importe desselben Moduls geben die zuvor importierte Instanz zurück. Module sind Singletons und bleiben bestehen, bis die Engine zerstört wird.

Die angegebene fileName wird intern mit QFileInfo::canonicalFilePath() normalisiert. Das bedeutet, dass mehrere Importe der gleichen Datei auf der Festplatte unter Verwendung unterschiedlicher relativer Pfade die Datei nur einmal laden.

Hinweis: Wenn während des Ladens des Moduls eine Ausnahme ausgelöst wird, ist der Rückgabewert die Ausnahme (typischerweise 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 auf dem Global Object, wenn kein Objekt angegeben wird.

Es können mehrere Erweiterungen auf einmal installiert werden, indem man die OR-Werte der Aufzählung angibt:

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

Siehe auch Extension.

bool QJSEngine::isInterrupted() const

Gibt zurück, ob die JavaScript-Ausführung gerade unterbrochen ist.

Siehe auch setInterrupted().

QJSValue QJSEngine::newArray(uint length = 0)

Erzeugt ein JavaScript-Objekt der Klasse Array mit der angegebenen length.

Siehe auch newObject().

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

Erzeugt ein JavaScript-Objekt der Klasse Error, mit message als Fehlermeldung.

Der Prototyp des erstellten Objekts ist errorType.

Siehe auch newObject(), throwError(), und QJSValue::isError().

QJSValue QJSEngine::newObject()

Erzeugt ein JavaScript-Objekt der Klasse Object.

Der Prototyp des erstellten Objekts ist das Objekt Object prototype.

Siehe auch newArray() und QJSValue::setProperty().

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

Erzeugt ein JavaScript-Objekt, das das statische QMetaObject umhüllt, das mit der Klasse T verbunden ist.

Siehe auch newQObject() und QObject Integration.

QJSValue QJSEngine::newQMetaObject(const QMetaObject *metaObject)

Erzeugt ein JavaScript-Objekt, das das angegebene QMetaObject umhüllt. metaObject muss die Script-Engine überdauern. Es wird empfohlen, diese Methode nur mit statischen Metaobjekten zu verwenden.

Wenn sie als Konstruktor aufgerufen wird, wird eine neue Instanz der Klasse erstellt. Nur Konstruktoren, die von Q_INVOKABLE offengelegt werden, sind für die Script-Engine sichtbar.

Siehe auch newQObject() und QObject Integration.

QJSValue QJSEngine::newQObject(QObject *object)

Erzeugt ein JavaScript-Objekt, das das angegebene QObject object umhüllt, wobei JavaScriptOwnership verwendet wird.

Signale und Slots, Eigenschaften und Kinder von object sind als Eigenschaften des erstellten QJSValue verfügbar.

Wenn object ein Null-Zeiger ist, gibt diese Funktion einen Null-Wert zurück.

Wenn ein Standardprototyp für die Klasse object(oder ihre Oberklasse, rekursiv) registriert wurde, wird der Prototyp des neuen Skriptobjekts auf diesen Standardprototyp gesetzt.

Wenn das angegebene object außerhalb der Kontrolle der Engine gelöscht wird, führt jeder Versuch, über das JavaScript-Wrapper-Objekt auf die Mitglieder des gelöschten QObject zuzugreifen (entweder durch Skriptcode oder C++), zu einem script exception.

Siehe auch QJSValue::toQObject().

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

Erzeugt ein JavaScript-Objekt der Klasse Symbol mit dem Wert name.

Der Prototyp des erstellten Objekts ist das Symbol-Prototyp-Objekt.

Diese Funktion wurde in Qt 6.2 eingeführt.

Siehe auch newObject().

[static] QJSEngine::ObjectOwnership QJSEngine::objectOwnership(QObject *object)

Gibt den Eigentümer von object zurück.

Siehe auch setObjectOwnership() und QJSEngine::ObjectOwnership.

bool QJSEngine::registerModule(const QString &moduleName, const QJSValue &value)

Registriert QJSValue, um als Modul zu dienen. Nach dem Aufruf dieser Funktion werden alle Module, die moduleName importieren, den Wert von value importieren, 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 Mitglieder eines Objekts behandelt, so dass der Standard-Export mit einer der newXYZ-Methoden von QJSEngine erstellt werden muss.

Da auf diese Weise Module importiert werden können, die nicht im Dateisystem vorhanden sind, können Skripting-Anwendungen dies nutzen, um eingebaute Module bereitzustellen, ähnlich wie bei Node.js.

Gibt bei Erfolg true zurück, andernfalls false.

Hinweis: QJSValue value wird nicht aufgerufen oder gelesen, bis es von einem anderen Modul verwendet wird. Das bedeutet, dass es keinen Code zum Auswerten gibt, so dass keine Fehler auftreten, bis ein anderes Modul beim Versuch, dieses Modul zu laden, eine Ausnahme auslöst.

Warnung: Der Versuch, von einem QJSValue, das kein Objekt ist, auf einen benannten Export zuzugreifen, löst eine exception aus.

Siehe auch importModule().

void QJSEngine::setInterrupted(bool interrupted)

Unterbricht die JavaScript-Ausführung oder aktiviert sie wieder.

Wenn interrupted gleich true ist, bricht jedes von dieser Engine ausgeführte JavaScript sofort ab und gibt ein Fehlerobjekt zurück, bis diese Funktion erneut mit einem Wert von false für interrupted aufgerufen wird.

Diese Funktion ist thread-sicher. Sie können sie von einem anderen Thread aus aufrufen, um z. B. eine Endlosschleife in JavaScript zu unterbrechen.

Siehe auch isInterrupted().

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

Setzt die ownership von object.

Ein Objekt mit JavaScriptOwnership wird nicht in den Müll geworfen, solange es noch ein übergeordnetes Objekt hat, auch wenn es keine Verweise auf dieses Objekt gibt.

Siehe auch objectOwnership() und QJSEngine::ObjectOwnership.

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

Löst einen Laufzeitfehler (Exception) mit dem angegebenen message aus.

Diese Methode ist das C++-Gegenstück eines throw() -Ausdrucks in JavaScript. Sie ermöglicht es C++-Code, Laufzeitfehler an QJSEngine zu melden. Daher sollte sie nur von 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 vorregistrierten Exception-Handler mit einem Fehlerobjekt auf, das den angegebenen message enthält. Das Fehlerobjekt verweist auf die Position des obersten Kontexts auf dem JavaScript-Aufrufer-Stack; insbesondere hat es die Eigenschaften lineNumber, fileName und stack. Diese Eigenschaften werden in Script Exceptions beschrieben.

Im folgenden Beispiel wirft eine C++-Methode in FileAccess.cpp einen Fehler in qmlFile.qml an der Stelle, 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 zur Beschreibung einer Ausnahme benötigen, können Sie die Überladung 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)

Diese Funktion überlastet throwError().

Wirft eine vorkonstruierte Laufzeit error (Ausnahme). Auf diese Weise können Sie newErrorObject() verwenden, um den Fehler zu erstellen und ihn nach Bedarf anzupassen.

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

Diese Funktion überlastet throwError().

Wirft einen Laufzeitfehler (Exception) mit dem angegebenen errorType und 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");
  }
  ...
}

Diese Funktion wurde in Qt 5.12 eingeführt.

Siehe auch Script Exceptions und newErrorObject().

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

Erzeugt eine QJSManagedValue mit der angegebenen value.

Siehe auch fromManagedValue() und coerceValue().

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

Erzeugt eine QJSPrimitiveValue mit dem angegebenen value.

Da QJSPrimitiveValue nur int, bool, double, QString und die Äquivalente von JavaScript null und undefined enthalten kann, wird der Wert aggressiv erzwungen, wenn Sie einen anderen Typ übergeben.

Siehe auch fromPrimitiveValue() und coerceValue().

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

Erzeugt eine QJSValue mit der angegebenen value.

Siehe auch fromScriptValue() und coerceValue().

Verwandte Nicht-Mitglieder

QJSEngine *qjsEngine(const QObject *object)

Gibt die QJSEngine zurück, die mit object verbunden ist, falls vorhanden.

Diese Funktion ist nützlich, wenn Sie eine QObject für die JavaScript-Umgebung freigegeben haben und später in Ihrem Programm wieder darauf zugreifen möchten. Es ist nicht erforderlich, den Wrapper zu behalten, der von QJSEngine::newQObject() zurückgegeben wurde.

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