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.
Umgebung für die Auswertung von JavaScript-Code | |
Operiert mit primitiven Typen in JavaScript-Semantik | |
fungiert als Container für Qt/JavaScript-Datentypen | |
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.
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.