QJSEngine Class
La classe QJSEngine fournit un environnement d'évaluation du code JavaScript. Plus d'informations...
| En-tête : | #include <QJSEngine> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Qml)target_link_libraries(mytarget PRIVATE Qt6::Qml) |
| qmake : | QT += qml |
| Hérite : | QObject |
| Hérité par : |
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
- uiLanguage : QString
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
| void | uiLanguageChanged() |
Membres publics statiques
| QJSEngine::ObjectOwnership | objectOwnership(QObject *object) |
| void | setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership) |
Non-membres apparentés
| QJSEngine * | qjsEngine(const QObject *object) |
Description détaillée
Evaluation des scripts
Utilisez evaluate() pour évaluer le code du script.
evaluate() renvoie une adresse QJSValue qui contient 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 une fonction de script peut être définie puis invoquée à partir de 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 de code ci-dessus, un script est fourni au moteur sous la forme d'une chaîne de caractères. Une façon courante de charger des scripts consiste à lire le contenu d'un fichier et à le transmettre à 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 passons le nom du fichier comme deuxième argument à evaluate(). Cela n'affecte en rien l'évaluation ; le deuxième argument est une chaîne de caractères générale qui est stockée dans l'objet Error à des fins de débogage.
Pour les 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 d'exportation pour décrire son interface avec le reste de l'application. À l'aide d'instructions d'importation, un module peut faire référence à des fonctionnalités d'autres modules. Cela permet de construire une application scénarisée à partir de blocs de construction plus petits et connectés d'une manière sûre. En revanche, l'approche consistant à utiliser evaluate() comporte le risque que les variables internes ou les fonctions d'un appel à evaluate() polluent accidentellement l'objet global et affectent les évaluations ultérieures.
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é avec 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 des 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 doivent pas nécessairement être des fichiers. Ils peuvent être des valeurs enregistrées avec 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 à partir de n'importe quel code de script (ce sont des variables globales). Généralement, avant d'évaluer les scripts "utilisateur", vous souhaiterez 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 standard de fournir une API de script spécifique à votre application. En général, ces propriétés personnalisées sont des objets créés par les fonctions newQObject() ou newObject().
Exceptions de script
evaluateLa fonction () peut lever une exception de script (par exemple, en raison d'une erreur de syntaxe). Si c'est le cas, evaluate() renvoie la valeur de l'exception (généralement un objet Error ). Utilisez QJSValue::isError() pour vérifier les exceptions.
Pour obtenir des informations détaillées sur l'erreur, utilisez QJSValue::toString() pour obtenir un message d'erreur et utilisez QJSValue::property() pour interroger les propriétés de l'objet Error. Les propriétés suivantes sont disponibles :
namemessagefileNamelineNumberstack
QJSValue result = myEngine.evaluate(...) ;if (result.isError()) qDebug() << "Uncaught exception at line"<< result.property("lineNumber").toInt() << " : "<< result.toString() ;
Création d'objets de script
Utilisez newObject() pour créer un objet JavaScript ; il s'agit de l'équivalent C++ de l'instruction de script new Object(). Vous pouvez utiliser la fonctionnalité spécifique à l'objet dans QJSValue pour manipuler l'objet script (par exemple QJSValue::setProperty()). De même, utilisez newArray() pour créer un tableau JavaScript.
Intégration de QObject
Utilisez newQObject() pour envelopper un pointeur QObject (ou une sous-classe). newQObject() renvoie un objet script proxy ; les propriétés, les enfants, les signaux et les slots de QObject sont disponibles en tant que propriétés de l'objet proxy. Aucun code de liaison n'est nécessaire car il est réalisé dynamiquement à l'aide du méta-système d'objets de 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 envelopper un QMetaObject; vous obtenez ainsi une "représentation script" d'une classe basée sur QObject. newQMetaObject() renvoie un objet script proxy ; les valeurs enum 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 à partir du script pour créer une nouvelle instance de QObject avec JavaScriptOwnership. Par exemple, compte tenu de la définition de classe suivante :
class MyObject : public QObject { Q_OBJECT public: Q_INVOKABLE MyObject() {} };
L'adresse 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 : actuellement, seules les classes utilisant la macro Q_OBJECT sont prises en charge ; il n'est pas possible d'exposer le staticMetaObject d'une classe Q_GADGET à JavaScript.
Propriétés des QObjets dynamiques
Les propriétés dynamiques de QObject ne sont pas prises en charge. Par exemple, le code suivant ne fonctionnera pas :
QJSEngine moteur ;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 ECMAScript conforme. Par défaut, les utilitaires familiers tels que la journalisation ne sont pas disponibles, mais ils peuvent être installés via la fonction installExtensions().
Voir également QJSValue, Making Applications Scriptable, et List of JavaScript Objects and Functions.
Documentation des types de membres
enum QJSEngine::Extension
flags QJSEngine::Extensions
Cette énumération est utilisée pour spécifier les extensions à installer via installExtensions().
| Constante | Valeur | Description |
|---|---|---|
QJSEngine::TranslationExtension | 0x1 | Indique que les fonctions de traduction (qsTr(), par exemple) doivent être installées. Cela installe également la propriété Qt.uiLanguage. |
QJSEngine::ConsoleExtension | 0x2 | Indique que les fonctions de console (console.log(), par exemple) doivent être installées. |
QJSEngine::GarbageCollectionExtension | 0x4 | Indique que les fonctions de collecte des déchets (gc(), par exemple) doivent être installées. |
QJSEngine::AllExtensions | 0xffffffff | Indique que toutes les extensions doivent être installées. |
TranslationExtension
La relation entre les fonctions de traduction de scripts et les fonctions de traduction C++ est décrite dans le tableau suivant :
| Fonction de script | Fonction 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() |
Ce drapeau ajoute également une fonction arg() au prototype de chaîne de caractères.
Pour plus d'informations, voir la documentation sur l 'internationalisation avec Qt.
Extension Console
L'objet console implémente un sous-ensemble de l'API Console, qui fournit des fonctions de journalisation familières, 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, voir la documentation de l 'API Console.
GarbageCollectionExtension
La fonction gc() équivaut à appeler collectGarbage().
Le type Extensions est un typedef pour QFlags<Extension>. Il stocke une combinaison OU de valeurs d'extension.
enum QJSEngine::ObjectOwnership
ObjectOwnership détermine si le gestionnaire de mémoire JavaScript détruit automatiquement l'adresse QObject lorsque l'objet JavaScript correspondant est ramassé par le moteur. Les deux options de propriété sont les suivantes :
| Constante | Valeur | Description de l'objet |
|---|---|---|
QJSEngine::CppOwnership | 0 | L'objet est la propriété du 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::JavaScriptOwnership | 1 | L'objet est la propriété de 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 suivra et le supprimera s'il n'y a plus de références JavaScript vers lui et s'il n'a pas de QObject::parent(). Un objet suivi par un QJSEngine sera supprimé lors du destructeur de ce QJSEngine. Ainsi, les références JavaScript entre des objets avec JavaScriptOwnership de deux moteurs différents ne seront pas valides si l'un de ces moteurs est supprimé. Cette option est similaire à QScriptEngine::ScriptOwnership. |
En général, 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 a JavaScriptOwnership. Les objets racines créés en appelant QQmlComponent::create() ou QQmlComponent::beginCreate() font exception à cette règle, car ils ont la propriété CppOwnership par défaut. 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 la propriété CppOwnership par défaut. Les objets renvoyés à la suite d'un appel de méthode C++ font exception à cette règle ; leur propriété est alors définie comme étant JavaScriptOwnership. Cela ne s'applique qu'aux invocations explicites de méthodes ou de slots Q_INVOKABLE, mais pas aux invocations de récupérateurs de propriétés.
L'appel à setObjectOwnership() annule la propriété par défaut.
Voir aussi Propriété des données.
Documentation sur les propriétés
uiLanguage : QString
Cette propriété définit 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 exposée en lecture et en écriture sous la forme Qt.uiLanguage lorsque QJSEngine::TranslationExtension est installé sur le moteur. Elle est toujours exposée dans les instances de QQmlEngine.
Vous pouvez définir la valeur librement et l'utiliser dans les bindings. 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 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 du notificateur :
| void | uiLanguageChanged() |
Fonction membre Documentation
QJSEngine::QJSEngine()
Construit un objet QJSEngine.
L'objet globalObject() est initialisé pour avoir les propriétés décrites dans la section 15.1 de l 'ECMA-262.
[explicit] QJSEngine::QJSEngine(QObject *parent)
Construit un objet QJSEngine avec l'adresse parent.
L'objet globalObject() est initialisé pour avoir les propriétés décrites dans la section 15.1 de l 'ECMA-262.
[override virtual noexcept] QJSEngine::~QJSEngine()
Détruit ce QJSEngine.
Les déchets ne sont pas collectés dans le tas persistant de JS pendant la destruction de QJSEngine. Si vous avez besoin de libérer toute la mémoire, appelez collectGarbage() manuellement juste avant de détruire QJSEngine.
[since Qt 6.1] QJSValue QJSEngine::catchError()
Si une exception est en cours, il l'attrape et la renvoie sous forme de QJSValue. Sinon, il renvoie une valeur non définie sous forme de QJSValue. Après avoir appelé 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'adresse from convertie au type de modèle To. La conversion est effectuée dans la sémantique JavaScript. Cette sémantique diffère de celle de qvariant_cast. Il existe un certain nombre de conversions implicites entre les types équivalents à 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 aussi fromVariant(), qvariant_cast(), fromScriptValue() et toScriptValue().
void QJSEngine::collectGarbage()
Exécute le ramasse-miettes.
Le ramasse-miettes tentera de récupérer de la mémoire en localisant et en éliminant 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 est automatiquement appelé lorsque QJSEngine décide qu'il est judicieux de le faire (c'est-à-dire lorsqu'un certain nombre de nouveaux objets ont été créés). Toutefois, vous pouvez appeler cette fonction pour demander explicitement que le ramasse-miettes soit exécuté dès que possible.
Voir aussi 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 numéro de ligne de base, 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 une évaluation dans un contexte QML, utilisez plutôt QQmlExpression.
L'évaluation de program peut provoquer une exception dans le moteur ; dans ce cas, la valeur de retour sera l'exception qui a été levée (typiquement 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 communiquées par le moteur pour 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 la ligne d'exception sera lineNumber plus un. Si aucun numéro de ligne de départ n'est spécifié, les numéros de ligne seront basés sur 1.
fileName est utilisé pour les rapports d'erreur. Par exemple, dans les objets d'erreur, le nom du fichier est accessible via la propriété "fileName" si elle est fournie avec cette fonction.
exceptionStackTrace est utilisé pour signaler si une exception non capturée a été levée. Si vous lui passez un pointeur non nul vers une adresse QStringList, elle lui attribuera la valeur "stackframe messages" si le script a déclenché une exception non gérée, ou une liste vide dans le cas contraire. Un message de pile a le format suivant : nom de la fonction, numéro de ligne, colonne, nom du fichier.
Note : 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 -1.
Note : Si une exception a été levée et que la valeur de l'exception n'est pas une instance d'erreur (c'est-à-dire que QJSValue::isError() renvoie false), la valeur de l'exception sera quand même renvoyée. Utilisez exceptionStackTrace->isEmpty() pour distinguer si la valeur est une valeur de retour normale ou exceptionnelle.
Voir également QQmlExpression::evaluate.
template <typename T> T QJSEngine::fromManagedValue(const QJSManagedValue &value)
Renvoie l'adresse value donnée convertie au type de modèle T.
Voir aussi toManagedValue() et coerceValue().
template <typename T> T QJSEngine::fromPrimitiveValue(const QJSPrimitiveValue &value)
Renvoie la valeur value convertie dans le type de modèle T.
Comme QJSPrimitiveValue ne peut contenir que int, bool, double, QString, et les équivalents de JavaScript null et undefined, la valeur sera contrainte agressivement si vous demandez un autre type.
Voir aussi toPrimitiveValue() et coerceValue().
template <typename T> T QJSEngine::fromScriptValue(const QJSValue &value)
Renvoie l'adresse value donnée convertie au type de modèle T.
Voir aussi toScriptValue() et coerceValue().
template <typename T> T QJSEngine::fromVariant(const QVariant &value)
Renvoie l'adresse value convertie au type de modèle T. La conversion est effectuée dans la sémantique JavaScript. Cette sémantique diffère de celle de qvariant_cast. Il existe un certain nombre de conversions implicites entre des types équivalents à JavaScript qui ne sont pas effectuées par défaut par qvariant_cast.
Voir aussi 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 qui font partie de l'ECMA-262, tels que Math, Date et String. En outre, vous pouvez définir les propriétés de l'objet global afin que vos propres extensions soient 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, de même que les variables locales du code global.
[since Qt 6.1] bool QJSEngine::hasError() const
Renvoie true si la dernière exécution JavaScript a donné lieu à une exception ou si throwError() a été appelé. Sinon, il renvoie false. Notez que evaluate() attrape toutes les exceptions lancé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 qui contient 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é dans le système de fichiers local ou dans le système de ressources Qt et évalué comme un module ECMAScript. Le fichier est censé être encodé en texte UTF-8.
Les importations ultérieures du même module renverront l'instance précédemment importée. Les modules sont des singletons et restent présents jusqu'à ce que le moteur soit détruit.
L'adresse fileName spécifiée sera normalisée en interne à l'aide de QFileInfo::canonicalFilePath(). Cela signifie que plusieurs importations du même fichier sur le disque en 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 (typiquement un objet Error; voir QJSValue::isError()).
Voir aussi registerModule().
void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSValue &object = QJSValue())
Installe JavaScript extensions pour ajouter des fonctionnalités qui ne sont pas disponibles dans une implémentation ECMAScript standard.
Les extensions sont installées sur le site object ou sur le site Global Object si aucun objet n'est spécifié.
Plusieurs extensions peuvent être installées en même temps en OR-ing les valeurs de l'énumération :
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 la classe Array avec l'adresse length.
Voir aussi newObject().
QJSValue QJSEngine::newErrorObject(QJSValue::ErrorType errorType, const QString &message = QString())
Crée un objet JavaScript de la classe Error, avec message comme message d'erreur.
Le prototype de l'objet créé sera errorType.
Voir aussi 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 aussi newArray() et QJSValue::setProperty().
template <typename T> QJSValue QJSEngine::newQMetaObject()
Crée un objet JavaScript qui englobe la 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 englobe l'objet QMetaObject. L'objet metaObject doit survivre au moteur de script. Il est recommandé de n'utiliser cette méthode qu'avec des métaobjets 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 par le moteur de script.
Voir également newQObject() et QObject Integration.
QJSValue QJSEngine::newQObject(QObject *object)
Crée un objet JavaScript qui englobe l'objet QObject object , en utilisant JavaScriptOwnership.
Les signaux et les emplacements, les propriétés et les enfants de object sont disponibles en tant que propriétés de l'objet créé QJSValue.
Si object est un pointeur nul, cette fonction renvoie une valeur nulle.
Si un prototype par défaut a été enregistré pour la classe de object(ou sa superclasse, récursivement), le prototype du nouvel objet script sera défini comme étant ce prototype par défaut.
Si l'objet object est supprimé en dehors du contrôle du moteur, toute tentative d'accès aux membres de l'objet QObject supprimé par l'intermédiaire de l'objet enveloppant JavaScript (que ce soit par le code du script ou par C++) entraînera une erreur script exception.
Voir également QJSValue::toQObject().
[since 6.2] QJSValue QJSEngine::newSymbol(const QString &name)
Crée un objet JavaScript de la classe Symbol, avec la valeur 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)
Retourne la propriété de object.
Voir aussi setObjectOwnership() et QJSEngine::ObjectOwnership.
bool QJSEngine::registerModule(const QString &moduleName, const QJSValue &value)
Enregistre un QJSValue pour qu'il serve de module. Après l'appel de cette fonction, tous les modules qui importent moduleName importeront la valeur de value au lieu de charger moduleName depuis le système de fichiers.
Tout QJSValue valide peut être enregistré, mais les exportations nommées (c'est-à-dire import { name } from "info" ) sont traitées comme des membres d'un objet, de sorte que l'exportation par défaut doit ê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 dans le système de fichiers, les applications de script peuvent l'utiliser pour fournir des modules intégrés, à l'instar de Node.js.
Retourne true en cas de succès, false dans le cas contraire.
Remarque : QJSValue value n'est pas appelé ou lu tant qu'il n'est pas utilisé par un autre module. Cela signifie qu'il n'y a pas de code à évaluer et qu'aucune erreur ne sera constatée jusqu'à ce qu'un autre module lance une exception en essayant de charger ce module.
Attention : Toute tentative d'accès à une exportation nommée à partir d'un QJSValue qui n'est pas un objet déclenchera une exception.
Voir aussi importModule().
void QJSEngine::setInterrupted(bool interrupted)
Interrompt ou réactive l'exécution de JavaScript.
Si interrupted est true, tout JavaScript exécuté par ce moteur est immédiatement interrompu et renvoie un objet d'erreur jusqu'à ce que cette fonction soit appelée à nouveau avec une valeur de false pour interrupted.
Cette fonction est sans risque pour les threads. Vous pouvez l'appeler à partir d'un autre thread afin d'interrompre, par exemple, une boucle infinie en JavaScript.
Voir aussi isInterrupted().
[static] void QJSEngine::setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership)
Fixe la valeur de ownership pour object.
Un objet avec JavaScriptOwnership n'est pas ramassé tant qu'il a encore un parent, même s'il n'y a plus de références vers lui.
Voir aussi objectOwnership() et QJSEngine::ObjectOwnership.
[since Qt 5.12] void QJSEngine::throwError(const QString &message)
Lance une erreur d'exécution (exception) avec l'adresse message.
Cette méthode est la contrepartie C++ d'une expression throw() en JavaScript. Elle permet au code C++ de signaler les erreurs d'exécution à QJSEngine. Par conséquent, elle ne doit être appelée qu'à partir d'un code C++ qui a été invoqué par une fonction JavaScript via QJSEngine.
Lorsqu'il revient de C++, le moteur interrompt le flux normal de l'exécution et appelle le prochain gestionnaire d'exception préenregistré avec un objet d'erreur qui contient l'expression message. L'objet d'erreur pointera vers l'emplacement du contexte le plus élevé de la pile de l'appelant JavaScript ; plus précisément, il aura 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 provoque 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'attraper l'erreur 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 throwError(QJSValue::ErrorType errorType, const QString &message).
Cette fonction a été introduite dans Qt 5.12.
Voir aussi Script Exceptions.
[since 6.1] void QJSEngine::throwError(const QJSValue &error)
Lance une exception ( error ) préconstruite au moment de l'exécution. Vous pouvez ainsi utiliser newErrorObject() pour créer l'erreur et la personnaliser si nécessaire.
Cette fonction surcharge QJSEngine::throwError().
Cette fonction a été introduite dans Qt 6.1.
Voir aussi Script Exceptions et newErrorObject().
[since Qt 5.12] void QJSEngine::throwError(QJSValue::ErrorType errorType, const QString &message = QString())
Lance une erreur d'exécution (exception) avec les données errorType et 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"); } ... }
Cette fonction surcharge QJSEngine::throwError().
Cette fonction a été introduite dans Qt 5.12.
Voir aussi Script Exceptions et newErrorObject().
template <typename T> QJSManagedValue QJSEngine::toManagedValue(const T &value)
Crée un QJSManagedValue avec le value donné.
Voir aussi fromManagedValue() et coerceValue().
template <typename T> QJSPrimitiveValue QJSEngine::toPrimitiveValue(const T &value)
Crée un QJSPrimitiveValue avec le type donné value.
Comme QJSPrimitiveValue ne peut contenir que int, bool, double, QString, et les équivalents de JavaScript null et undefined, la valeur sera contrainte agressivement si vous passez un autre type.
Voir aussi fromPrimitiveValue() et coerceValue().
template <typename T> QJSValue QJSEngine::toScriptValue(const T &value)
Crée un QJSValue avec le value donné.
Voir aussi fromScriptValue() et coerceValue().
Non-membres apparentés
QJSEngine *qjsEngine(const QObject *object)
Renvoie l'adresse QJSEngine associée à object, le cas échéant.
Cette fonction est utile si vous avez exposé un QObject à l'environnement JavaScript et que, plus tard dans votre programme, vous souhaitez en rétablir l'accès. Elle ne vous oblige pas à conserver l'enveloppe renvoyée par 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.