Anwendungen skriptfähig machen

Qt bietet Unterstützung für das Skripting von Anwendungen mit JavaScript. Die folgenden Handbücher und Referenzen behandeln Aspekte der Programmierung mit JavaScript und Qt.

Skripting-Klassen

Die folgenden Klassen fügen Skripting-Fähigkeiten zu Qt-Anwendungen hinzu.

QJSEngine

Umgebung für die Auswertung von JavaScript-Code

QJSPrimitiveValue

Operiert mit primitiven Typen in JavaScript-Semantik

QJSValue

fungiert als Container für Qt/JavaScript-Datentypen

QJSValueIterator

Iterator im Java-Stil für QJSValue

Grundlegende Verwendung

Um Skriptcode zu evaluieren, erstellen Sie eine QJSEngine und rufen deren evaluate()-Funktion auf, wobei Sie den zu evaluierenden Skriptcode (Text) als Argument übergeben.

QJSEngine Motor;qDebug() << "the magic number is:" << engine.evaluate("1 + 2").toNumber();

Der Rückgabewert ist das Ergebnis der Auswertung (dargestellt als QJSValue Objekt); dieses kann in Standard C++ und Qt Typen konvertiert werden.

Benutzerdefinierte Eigenschaften können Skripten zur Verfügung gestellt werden, indem sie bei der Skript-Engine registriert werden. Dies geschieht am einfachsten durch das Setzen von Eigenschaften des Global Objects der Skript-Engine:

engine.globalObject().setProperty("foo", 123);qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();

Dadurch werden die Eigenschaften in der Skriptumgebung platziert und sind somit für den Skriptcode verfügbar.

Ein QObjekt für die Skript-Engine verfügbar machen

Jede QObject-basierte Instanz kann für die Verwendung mit Skripten verfügbar gemacht werden.

Wenn ein QObject an die Funktion QJSEngine::newQObject() übergeben wird, wird ein Qt-Skript-Wrapper-Objekt erstellt, das verwendet werden kann, um die Signale, Slots, Eigenschaften und Unterobjekte von QObject für Skripte verfügbar zu machen.

Hier ein Beispiel, um eine Instanz einer QObject Unterklasse unter dem Namen "myObject" für Skriptcode verfügbar zu machen:

QJSEngine engine;
QObject *someObject = new MyObject;
QJSValue objectValue = engine.newQObject(someObject);
engine.globalObject().setProperty("myObject", objectValue);

Dadurch wird eine globale Variable namens myObject in der Skriptumgebung erstellt. Die Variable dient als Proxy für das zugrunde liegende C++-Objekt. Beachten Sie, dass der Name der Skriptvariablen beliebig sein kann, d.h. er ist nicht von QObject::objectName() abhängig.

Implikationen für die Anwendungssicherheit

Das Sicherheitsmodell für Anwendungsskripte mit JavaScript folgt dem gleichen Modell wie für C++-Code: Der Benutzer installiert Skripte, denen er vertraut, auf die gleiche Weise, wie er Qt-Anwendungen installiert.

Um das Vertrauen der Benutzer zu bewahren, sollten Anwendungsentwickler keinen willkürlichen JavaScript-Code auswerten. Die Sandbox der JavaScript-Engine ist nur eine semantische Barriere. Das Skript wird im selben Prozess und mit denselben Rechten wie der Rest der Anwendung ausgewertet und teilt sich denselben Speicher. Dies hat zur Folge, dass C++-Objekte, die Skripten ausgesetzt sind, ohne zusätzliche Sicherheitsvorkehrungen zugänglich sind.

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