Sur cette page

QJSEngine Class

La classe QJSEngine offre un environnement permettant d'évaluer du code JavaScript. En savoir plus...

En-tête : #include <QJSEngine>
CMake : find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake : QT += qml
Hérite de : QObject
Hérédité :

QQmlEngine

Remarque : toutes les fonctions de cette classe sont réentrantes.

Types publics

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

Propriétés

Fonctions publiques

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

Signaux

Membres publics statiques

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

Description détaillée

Évaluation des scripts

Utilisez la fonction ` evaluate()` pour évaluer le code d'un script.

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

evaluate() renvoie un objet ` QJSValue ` contenant le résultat de l'évaluation. La classe ` QJSValue ` fournit des fonctions permettant de convertir le résultat en divers types C++ (par exemple, ` QJSValue::toString()` et ` QJSValue::toNumber()`).

L'extrait de code suivant montre comment définir une fonction de script, puis l'appeler depuis le C++ à l'aide de ` QJSValue::call()` :

QJSValue fun = myEngine.evaluate("(function(a, b) { return a + b; })");
QJSValueList args;
args << 1 << 2;
QJSValue threeAgain = fun.call(args);

Comme le montrent les extraits ci-dessus, un script est fourni au moteur sous la forme d’une chaîne de caractères. Une méthode courante pour charger des scripts consiste à lire le contenu d’un fichier et à le transmettre à la fonction ` 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);

Ici, nous transmettons le nom du fichier en tant que deuxième argument à la fonction ` evaluate()`. Cela n’affecte en rien l’évaluation ; le deuxième argument est une chaîne de caractères générique qui est stockée dans l’objet ` Error ` à des fins de débogage.

Pour des fonctionnalités plus importantes, vous pouvez encapsuler votre code et vos données dans des modules. Un module est un fichier qui contient du code de script, des variables, etc., et qui utilise des instructions `export` pour décrire son interface vis-à-vis du reste de l’application. À l’aide d’instructions `import`, un module peut faire appel à des fonctionnalités provenant d’autres modules. Cela permet de construire une application scriptée à partir de petits blocs fonctionnels interconnectés, en toute sécurité. En revanche, l’approche consistant à utiliser ` evaluate()` comporte le risque que des variables ou des fonctions internes issues d’un appel à ` evaluate()` polluent accidentellement l’objet global et affectent les évaluations suivantes.

L’exemple suivant présente un module capable d’additionner des nombres :

export function sum(left, right)
{
    return left + right
}

Ce module peut être chargé à l’aide de `QJSEngine::import()` s’il est enregistré sous le nom ` math.mjs` :

QJSvalue module = myEngine.importModule("./math.mjs");
QJSValue sumFunction = module.property("sum");
QJSValue result = sumFunction.call(args);

Les modules peuvent également utiliser les fonctionnalités d'autres modules à l'aide d'instructions d'importation :

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

Les modules ne sont pas nécessairement des fichiers. Il peut s'agir de valeurs enregistrées via la fonction ` 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();

Les exportations nommées sont prises en charge, mais comme elles sont traitées comme des membres d’un objet, l’exportation par défaut doit être un objet ECMAScript. La plupart des fonctions newXYZ de ` QJSValue ` renvoient un objet.

QJSValue name("Qt6");
QJSValue obj = myEngine.newObject();
obj.setProperty("name", name);
myEngine.registerModule("info", obj);
import { name } from "info";

export function getName()
{
    return name;
}

Configuration du moteur

La fonction ` globalObject()` renvoie l’objet global associé au moteur de script. Les propriétés de l’objet global sont accessibles depuis n’importe quel code de script (c’est-à-dire qu’il s’agit de variables globales). En règle générale, avant d’évaluer des scripts « utilisateur », vous devrez configurer un moteur de script en ajoutant une ou plusieurs propriétés à l’objet global :

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

L'ajout de propriétés personnalisées à l'environnement de script est l'un des moyens courants de fournir une API de script spécifique à votre application. Généralement, ces propriétés personnalisées sont des objets créés par les fonctions newQObject() ou newObject().

Exceptions de script

evaluate() peut lever une exception de script (par exemple en raison d'une erreur de syntaxe). Dans ce cas, la fonction evaluate() renvoie la valeur qui a été levée (généralement un objet Error ). Utilisez la fonction QJSValue::isError() pour détecter les exceptions.

Pour obtenir des informations détaillées sur l’erreur, utilisez QJSValue::toString() pour récupérer un message d’erreur, puis QJSValue::property() pour interroger les propriétés de l’objet Error. Les propriétés suivantes sont disponibles :

  • name
  • message
  • fileName
  • lineNumber
  • stack
QJSValue result = myEngine.evaluate(...);
if (result.isError())
    qDebug()
           <<  « Exception non gérée à la ligne »
            << result.property("lineNumber").toInt()
            <<  « : » << result.toString();

Création d’un objet script

Utilisez newObject() pour créer un objet JavaScript ; cela correspond en C++ à l’instruction script new Object(). Vous pouvez utiliser les fonctionnalités spécifiques aux objets décrites dans QJSValue pour manipuler l’objet script (par exemple, QJSValue::setProperty()). De même, utilisez newArray() pour créer un objet tableau JavaScript.

Intégration avec QObject

Utilisez newQObject() pour encapsuler un pointeur vers un QObject (ou une sous-classe). newQObject() renvoie un objet script proxy ; les propriétés, les enfants, ainsi que les signaux et les slots de l'QObject sont accessibles en tant que propriétés de l'objet proxy. Aucun code de liaison n'est nécessaire, car celle-ci est effectuée dynamiquement à l'aide du système de méta-objets Qt.

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(); // appelle le slot show()

Utilisez ` newQMetaObject()` pour encapsuler un ` QMetaObject` ; cela vous donne une « représentation script » d’une classe dérivée de ` QObject`. ` newQMetaObject()` renvoie un objet script proxy ; les valeurs d’énumération de la classe sont disponibles en tant que propriétés de l’objet proxy.

Les constructeurs exposés au système de méta-objets (à l’aide de ` Q_INVOKABLE`) peuvent être appelés depuis le script pour créer une nouvelle instance de ` QObject ` avec ` JavaScriptOwnership`. Par exemple, étant donné la définition de classe suivante :

class MyObject : public QObject
{
    Q_OBJECT

public:
    Q_INVOKABLE MyObject() {}
};

L’ staticMetaObject de la classe peut être exposée à JavaScript de la manière suivante :

QJSValue jsMetaObject = engine.newQMetaObject(&MyObject::staticMetaObject);
engine.globalObject().setProperty("MyObject", jsMetaObject);

Des instances de la classe peuvent alors être créées en JavaScript :

engine.evaluate("var myObject = new MyObject()");

Remarque : pour l'instant , seules les classes utilisant la macro ` Q_OBJECT ` sont prises en charge ; il n'est pas possible d'exposer la ` staticMetaObject ` d'une classe ` Q_GADGET ` à JavaScript.

Propriétés dynamiques de QObject

Les propriétés dynamiques de ` QObject ` ne sont pas prises en charge. Par exemple, le code suivant ne fonctionnera pas :

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

Extensions

QJSEngine fournit une implémentation conforme à ECMAScript. Par défaut, les utilitaires courants tels que la journalisation ne sont pas disponibles, mais ils peuvent être installés via la fonction installExtensions().

Voir également QJSValue, Rendre les applications scriptables et Liste des objets et fonctions JavaScript.

Documentation sur les types de membres

enum QJSEngine::Extension
flags QJSEngine::Extensions

Cette énumération sert à spécifier les extensions à installer via la fonction ` installExtensions()`.

ConstanteValeurDescription
QJSEngine::TranslationExtension0x1Indique que les fonctions de traduction (qsTr(), par exemple) doivent être installées. Cela installe également la propriété Qt.uiLanguage.
QJSEngine::ConsoleExtension0x2Indique que les fonctions de console (console.log(), par exemple) doivent être installées.
QJSEngine::GarbageCollectionExtension0x4Indique que les fonctions de ramasse-miettes (par exemple,gc()) doivent être installées.
QJSEngine::AllExtensions0xffffffffIndique que toutes les extensions doivent être installées.

TranslationExtension

La relation entre les fonctions de traduction de script et les fonctions de traduction C++ est décrite dans le tableau suivant :

Fonction de scriptFonction C++ correspondante
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()

Cet indicateur ajoute également une fonction ` arg() ` au prototype de la chaîne.

Pour plus d’informations, consultez la documentation « Internationalisation avec Qt ».

ConsoleExtension

L'objet console implémente un sous-ensemble de l'API Console, qui fournit des fonctions de journalisation courantes, telles que ` console.log()`.

La liste des fonctions ajoutées est la suivante :

  • console.assert()
  • console.debug()
  • console.exception()
  • console.info()
  • console.log() (équivalent à ` console.debug()`)
  • console.error()
  • console.time()
  • console.timeEnd()
  • console.trace()
  • console.count()
  • console.warn()
  • print() (équivalent à ` console.debug()`)

Pour plus d’informations, consultez la documentation de l’API Console.

GarbageCollectionExtension

La fonction gc() équivaut à l'appel de collectGarbage().

Le type Extensions est un typedef pour QFlags<Extension>. Il stocke une combinaison OU de valeurs Extension.

enum QJSEngine::ObjectOwnership

La propriété « ObjectOwnership » détermine si le gestionnaire de mémoire JavaScript détruit automatiquement l’ QObject lorsque l’objet JavaScript correspondant est supprimé par le moteur lors du ramasse-miettes. Les deux options disponibles sont les suivantes :

ConstanteValeurDescription
QJSEngine::CppOwnership0L'objet appartient au code C++ et le gestionnaire de mémoire JavaScript ne le supprimera jamais. La méthode JavaScript `destroy()` ne peut pas être utilisée sur ces objets. Cette option est similaire à `QScriptEngine::QtOwnership`.
QJSEngine::JavaScriptOwnership1L'objet appartient à JavaScript. Lorsque l'objet est renvoyé au gestionnaire de mémoire JavaScript en tant que valeur de retour d'un appel de méthode, le gestionnaire de mémoire JavaScript le suit et le supprime s'il n'y a plus aucune référence JavaScript vers celui-ci et s'il n'a pas d'QObject::parent(). Un objet suivi par un moteur QJSEngine sera supprimé lors de l’exécution du destructeur de ce moteur QJSEngine. Ainsi, les références JavaScript entre des objets ayant la propriété JavaScriptOwnership provenant de deux moteurs différents ne seront plus valides si l’un de ces moteurs est supprimé. Cette option est similaire à QScriptEngine::ScriptOwnership.

En règle générale, une application n’a pas besoin de définir explicitement la propriété d’un objet. Le gestionnaire de mémoire JavaScript utilise une heuristique pour définir la propriété par défaut. Par défaut, un objet créé par le gestionnaire de mémoire JavaScript possède la propriété JavaScriptOwnership. Font exception à cette règle les objets racines créés par l'appel de ` QQmlComponent::create()` ou ` QQmlComponent::beginCreate()`, qui ont par défaut la propriété `CppOwnership`. La propriété de ces objets de niveau racine est considérée comme ayant été transférée à l'appelant C++.

Les objets non créés par le gestionnaire de mémoire JavaScript ont, par défaut, la propriété CppOwnership. Les objets renvoyés par des appels de méthodes C++ font exception à cette règle ; leur propriété sera définie sur JavaScriptOwnership. Cela s’applique uniquement aux invocations explicites des méthodes ou des slots de ` Q_INVOKABLE `, mais pas aux invocations de getters de propriétés.

L'appel de ` setObjectOwnership()` remplace la propriété par défaut.

Voir également Propriété des données.

Documentation sur les propriétés

uiLanguage : QString

Cette propriété contient la langue à utiliser pour la traduction des chaînes de l'interface utilisateur

Cette propriété contient le nom de la langue à utiliser pour la traduction des chaînes de l'interface utilisateur. Elle est accessible en lecture et en écriture sous le nom Qt.uiLanguage lorsque l'QJSEngine::TranslationExtension est installée sur le moteur. Elle est toujours accessible dans les instances de QQmlEngine.

Vous pouvez définir librement sa valeur et l’utiliser dans des liaisons. Il est recommandé de la définir après avoir installé les traducteurs dans votre application. Par convention, une chaîne vide signifie qu’aucune traduction à partir de la langue utilisée dans le code source n’est prévue.

Fonctions d’accès :

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

Signal de notification :

void uiLanguageChanged()

Documentation des fonctions membres

QJSEngine::QJSEngine()

Crée un objet QJSEngine.

L'globalObject() est initialisé pour disposer des propriétés décrites dans la norme ECMA-262, section 15.1.

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

Crée un objet QJSEngine avec l'parent fournie.

L'globalObject() est initialisé de manière à posséder les propriétés décrites dans la section 15.1 de la norme ECMA-262.

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

Détruit cette QJSEngine.

Le ramasse-miettes ne récupère pas les objets du tas JS persistant lors de la destruction de l'QJSEngine. Si vous souhaitez libérer toute la mémoire, appelez manuellement la fonction collectGarbage() juste avant de détruire l'QJSEngine.

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

Si une exception est actuellement en attente, cette méthode la capture et la renvoie sous la forme d'un objet ` QJSValue`. Sinon, elle renvoie la valeur indéfinie ` QJSValue`. Après l'appel de cette méthode, ` hasError()` renvoie ` false`.

Cette fonction a été introduite dans Qt 6.1.

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

Renvoie l'from donné converti vers le type de modèle To. La conversion s'effectue selon la sémantique JavaScript. Celle-ci diffère de la sémantique de qvariant_cast. Il existe un certain nombre de conversions implicites entre des types équivalents en JavaScript qui ne sont pas effectuées par défaut par qvariant_cast. Cette méthode est une généralisation de toutes les autres méthodes de conversion de cette classe.

Voir également fromVariant(), qvariant_cast(), fromScriptValue() et toScriptValue().

void QJSEngine::collectGarbage()

Lance le ramasse-miettes.

Le ramasse-miettes tentera de libérer de la mémoire en localisant et en supprimant les objets qui ne sont plus accessibles dans l’environnement du script.

Normalement, vous n’avez pas besoin d’appeler cette fonction ; le ramasse-miettes sera automatiquement invoqué lorsque l’ QJSEngine ur décidera qu’il est judicieux de le faire (c’est-à-dire lorsqu’un certain nombre de nouveaux objets auront été créés). Cependant, vous pouvez appeler cette fonction pour demander explicitement que le ramasse-miettes soit exécuté dès que possible.

Voir également «Garbage Collection » et « gc() ».

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

Évalue ` program`, en utilisant ` lineNumber ` comme nombre de référence, et renvoie le résultat de l'évaluation.

Le code du script sera évalué dans le contexte de l'objet global.

Remarque : si vous devez effectuer l'évaluation dans un contexte QML, utilisez plutôt ` QQmlExpression `.

L’évaluation de ` program ` peut provoquer une exception ` exception ` dans le moteur ; dans ce cas, la valeur renvoyée sera l’exception levée (généralement un objet ` Error ` ; voir ` QJSValue::isError()`).

lineNumber est utilisé pour spécifier un numéro de ligne de départ pour program; les informations relatives au numéro de ligne fournies par le moteur concernant cette évaluation seront basées sur cet argument. Par exemple, si program se compose de deux lignes de code et que l’instruction de la deuxième ligne provoque une exception de script, le numéro de ligne de l’exception correspondra à lineNumber plus un. Lorsqu’aucun numéro de ligne de départ n’est spécifié, la numérotation des lignes commence à 1.

fileName est utilisé pour le rapport d’erreurs. Par exemple, dans les objets d’erreur, le nom du fichier est accessible via la propriété « fileName » s’il est fourni à cette fonction.

exceptionStackTrace est utilisée pour signaler si une exception non gérée a été levée. Si vous lui transmettez un pointeur non nul vers une instance de ` QStringList `, elle le remplira avec une liste de « messages de cadre de pile » si le script a levé une exception non gérée, ou avec une liste vide dans le cas contraire. Un message de cadre de pile a le format suivant : nom de la fonction : numéro de ligne : colonne : nom de fichier

Remarque : dans certains cas, par exemple pour les fonctions natives, le nom de la fonction et le nom du fichier peuvent être vides, et le numéro de ligne et la colonne peuvent être égaux à -1.

Remarque : si une exception a été levée et que la valeur de l’exception n’est pas une instance de Error (c’est-à-dire que QJSValue::isError() renvoie false), la valeur de l’exception sera tout de même renvoyée. Utilisez exceptionStackTrace->isEmpty() pour déterminer si la valeur était une valeur de retour normale ou exceptionnelle.

Voir également QQmlExpression::evaluate.

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

Renvoie l'value donné converti en type de modèle T.

Voir également ` toManagedValue()` et ` coerceValue()`.

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

Renvoie l'value donné converti en type de modèle T.

Étant donné que ` QJSPrimitiveValue ` ne peut contenir que des valeurs de type `int`, `bool`, `double`, ` QString`, ainsi que les équivalents JavaScript de ` null ` et ` undefined`, la valeur sera convertie de manière agressive si vous demandez un autre type.

Voir également toPrimitiveValue() et coerceValue().

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

Renvoie l'value donné converti en type de modèle T.

Voir également toScriptValue() et coerceValue().

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

Renvoie l'value donné converti au type de modèle T. La conversion est effectuée selon la sémantique JavaScript. Celle-ci diffère de la sémantique de qvariant_cast. Il existe un certain nombre de conversions implicites entre des types équivalents en JavaScript qui ne sont pas effectuées par défaut par qvariant_cast.

Voir également coerceValue(), fromScriptValue() et qvariant_cast().

QJSValue QJSEngine::globalObject() const

Renvoie l'objet global de ce moteur.

Par défaut, l’objet global contient les objets intégrés faisant partie de la norme ECMA-262, tels que Math, Date et String. De plus, vous pouvez définir des propriétés de l’objet global afin de rendre vos propres extensions accessibles à l’ensemble du code de script. Les variables non locales du code de script seront créées en tant que propriétés de l'objet global, tout comme les variables locales du code global.

[since Qt 6.1] bool QJSEngine::hasError() const

Renvoie ` true ` si la dernière exécution JavaScript a généré une exception ou si la fonction ` throwError()` a été appelée. Dans le cas contraire, renvoie ` false`. Notez que la fonction ` evaluate()` intercepte toutes les exceptions levées dans le code évalué.

Cette fonction a été introduite dans Qt 6.1.

QJSValue QJSEngine::importModule(const QString &fileName)

Importe le module situé à l'adresse fileName et renvoie un objet d'espace de noms de module contenant toutes les variables, constantes et fonctions exportées en tant que propriétés.

Si c'est la première fois que le module est importé dans le moteur, le fichier est chargé à partir de l'emplacement spécifié, soit dans le système de fichiers local, soit dans le système de ressources Qt, puis évalué en tant que module ECMAScript. Le fichier doit être encodé en texte UTF-8.

Les importations suivantes du même module renverront l’instance précédemment importée. Les modules sont des singletons et persistent jusqu’à la destruction du moteur.

L'fileName e spécifié sera normalisé en interne à l'aide de la fonction ` QFileInfo::canonicalFilePath()`. Cela signifie que plusieurs importations du même fichier sur le disque, utilisant des chemins relatifs différents, ne chargeront le fichier qu'une seule fois.

Remarque : si une exception est levée pendant le chargement du module, la valeur de retour sera l’exception (généralement un objet ` Error ` ; voir ` QJSValue::isError()`).

Voir également registerModule().

void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSValue &object = QJSValue())

Installe des extensions JavaScript extensions afin d'ajouter des fonctionnalités qui ne sont pas disponibles dans une implémentation standard d'ECMAScript.

Les extensions sont installées sur l'object spécifié, ou sur l'Global Object si aucun objet n'est spécifié.

Plusieurs extensions peuvent être installées simultanément en utilisant la méthode ` OR` avec les valeurs de l'énumération :

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

Voir également ` Extension`.

bool QJSEngine::isInterrupted() const

Indique si l'exécution de JavaScript est actuellement interrompue.

Voir également setInterrupted().

QJSValue QJSEngine::newArray(uint length = 0)

Crée un objet JavaScript de classe `Array` à partir de l'length` fournie.

Voir aussi newObject().

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

Crée un objet JavaScript de classe « Error », avec « message » comme message d'erreur.

Le prototype de l'objet créé sera errorType.

Voir également newObject(), throwError() et QJSValue::isError().

QJSValue QJSEngine::newObject()

Crée un objet JavaScript de la classe `Object`.

Le prototype de l'objet créé sera l'objet prototype Object.

Voir également newArray() et QJSValue::setProperty().

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

Crée un objet JavaScript qui encapsule la méthode statique ` QMetaObject ` associée à la classe ` T`.

Voir également newQObject() et QObject Integration.

QJSValue QJSEngine::newQMetaObject(const QMetaObject *metaObject)

Crée un objet JavaScript qui encapsule l'QMetaObject fournie. L'metaObject doit survivre au moteur de script. Il est recommandé de n'utiliser cette méthode qu'avec des méta-objets statiques.

Lorsqu’elle est appelée en tant que constructeur, une nouvelle instance de la classe est créée. Seuls les constructeurs exposés par ` Q_INVOKABLE ` seront visibles depuis le moteur de script.

Voir également newQObject() et QObject Integration.

QJSValue QJSEngine::newQObject(QObject *object)

Crée un objet JavaScript qui encapsule l'QObject object fourni, en utilisant JavaScriptOwnership.

Les signaux et slots, ainsi que les propriétés et les éléments enfants de ` object ` sont disponibles en tant que propriétés de l'objet ` QJSValue` créé.

Si ` object ` est un pointeur nul, cette fonction renvoie une valeur nulle. Il en va de même si ` object ` a été marqué pour suppression ou si son destructeur est déjà en cours d’exécution.

Si un prototype par défaut a été enregistré pour la classe de l’ object(ou sa superclasse, de manière récursive), le prototype du nouvel objet script sera défini comme étant ce prototype par défaut.

Si l’ object donné est supprimé hors du contrôle du moteur, toute tentative d’accès aux membres de l’ QObject supprimé via l’objet wrapper JavaScript (que ce soit par du code de script ou en C++) entraînera une exception « script exception ».

Voir également QJSValue::toQObject().

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

Crée un objet JavaScript de classe Symbol, dont la valeur est « name ».

Le prototype de l'objet créé sera l'objet prototype Symbol.

Cette fonction a été introduite dans Qt 6.2.

Voir aussi newObject().

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

Renvoie le propriétaire de object.

Voir également setObjectOwnership() et QJSEngine::ObjectOwnership.

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

Enregistre une QJSValue pour qu’elle serve de module. Une fois cette fonction appelée, tous les modules qui importent moduleName importeront la valeur de value au lieu de charger moduleName depuis le système de fichiers.

Toute QJSValue valide peut être enregistrée, mais les exportations nommées (par exemple import { name } from "info") sont traitées comme des membres d'un objet ; l'exportation par défaut doit donc être créée à l'aide de l'une des méthodes newXYZ de QJSEngine.

Comme cela permet d’importer des modules qui n’existent pas sur le système de fichiers, les applications de script peuvent s’en servir pour fournir des modules intégrés, à l’instar de Node.js.

Renvoie ` true ` en cas de succès, ` false ` dans le cas contraire.

Remarque : l’ QJSValue value n’est ni appelée ni lue tant qu’elle n’est pas utilisée par un autre module. Cela signifie qu’il n’y a pas de code à évaluer ; aucune erreur n’apparaîtra donc tant qu’un autre module n’aura pas levé d’exception en tentant de charger ce module.

Avertissement : toute tentative d’accès à une exportation nommée à partir d’un ` QJSValue ` qui n’est pas un objet déclenchera une exception ` exception`.

Avertissement : Lorsqu’un module est enregistré, le moteur évalue et capture les propriétés de ` value ` afin de déterminer ce qui sera exporté. Pour un ` QObject` encapsulé, cela signifie que ses propriétés ne sont lues qu’une seule fois, et que les modifications ultérieures apportées à ces propriétés ne seront pas prises en compte lors d’un accès depuis JavaScript. Si votre ` QObject ` possède des propriétés dont les valeurs changent après l’enregistrement du module, n’enregistrez pas directement l’` QObject `. Encapsulez-le plutôt dans un autre objet :

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

Voir également importModule().

void QJSEngine::setInterrupted(bool interrupted)

Interrompt ou réactive l'exécution de JavaScript.

Si interrupted est défini sur true, tout code JavaScript exécuté par ce moteur est immédiatement interrompu et renvoie un objet d'erreur jusqu'à ce que cette fonction soit à nouveau appelée avec une valeur de false pour interrupted.

Cette fonction est sûre pour les threads. Vous pouvez l’appeler depuis un autre thread afin d’interrompre, par exemple, une boucle infinie en JavaScript.

Voir également isInterrupted().

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

Définit l'ownership de object.

Un objet doté de l'JavaScriptOwnership n'est pas récupéré par le ramasse-miettes tant qu'il possède encore un parent, même s'il n'y a aucune référence vers lui.

Voir également ` objectOwnership()` et ` QJSEngine::ObjectOwnership`.

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

Génère une erreur d'exécution (exception) avec l'message spécifiée.

Cette méthode est l’équivalent en C++ d’une expression ` throw() ` en JavaScript. Elle permet au code C++ de signaler des erreurs d’exécution à ` QJSEngine`. Elle ne doit donc être appelée qu’à partir de code C++ qui a été invoqué par une fonction JavaScript via ` QJSEngine`.

Lors du retour depuis le C++, le moteur interrompt le flux d’exécution normal et appelle le gestionnaire d’exceptions préenregistré suivant avec un objet d’erreur contenant l’ message donné. L’objet d’erreur pointe vers l’emplacement du contexte le plus haut dans la pile d’appel JavaScript ; plus précisément, il possède les propriétés lineNumber, fileName et stack. Ces propriétés sont décrites dans Script Exceptions.

Dans l’exemple suivant, une méthode C++ dans FileAccess.cpp lève une erreur dans qmlFile.qml à l’endroit où readFileAsText() est appelé :

// 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;
}

Il est également possible d’intercepter l’erreur levée en 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);
  }
}

Si vous avez besoin d’une erreur d’exécution plus spécifique pour décrire une exception, vous pouvez utiliser la surcharge de la fonction throwError(QJSValue::ErrorType errorType, const QString &message).

Cette fonction a été introduite dans Qt 5.12.

Voir également Script Exceptions.

[since 6.1] void QJSEngine::throwError(const QJSValue &error)

Lance une exception « error » prédéfinie. Cela vous permet d'utiliser la méthode ` newErrorObject()` pour créer l'erreur et la personnaliser selon vos besoins.

Cette fonction surcharge la méthode QJSEngine::throwError().

Cette fonction a été introduite dans Qt 6.1.

Voir également Script Exceptions et newErrorObject().

[since Qt 5.12] void QJSEngine::throwError(QJSValue::ErrorType errorType, const QString &message = QString())

Génère une erreur d'exécution (exception) avec les paramètres ` errorType ` et ` message` fournis.

// 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");
  }
  ...
}

Cette fonction surcharge la méthode QJSEngine::throwError().

Cette fonction a été introduite dans Qt 5.12.

Voir également Script Exceptions et newErrorObject().

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

Crée un objet ` QJSManagedValue ` avec la ` value` indiquée.

Voir également fromManagedValue() et coerceValue().

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

Crée un ` QJSPrimitiveValue ` avec l'value` spécifiée.

Étant donné qu’une QJSPrimitiveValue ne peut contenir que des valeurs de type int, bool, double, QString, ainsi que les équivalents JavaScript de null et undefined, la valeur sera convertie de manière agressive si vous passez un autre type.

Voir également fromPrimitiveValue() et coerceValue().

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

Crée un objet ` QJSValue ` avec l'value` indiquée.

Voir également fromScriptValue() et coerceValue().

Éléments non membres associés

QJSEngine *qjsEngine(const QObject *object)

Renvoie l'QJSEngine associé à object, le cas échéant.

Cette fonction est utile si vous avez exposé une QObject à l’environnement JavaScript et que vous souhaitez y accéder à nouveau plus tard dans votre programme. Elle ne nécessite pas de conserver l’objet wrapper renvoyé par la fonction QJSEngine::newQObject().

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