[Qt] Module de Scripting

C’est parti pour vous parler d’un module de Qt, tout nouveau (disponible depuis la version 4.5) et qui permet de manipuler du JavaScript avec du C++.

1. Intérêt:

L’atout majeur est de pouvoir piloter du code C++, il n’y a plus de limite, nous pouvons scripter n’importe quel programme. C’est la création d’un robot “intelligent”.
Un code simple (javascript), la vitesse de ce langage et la facilité de mise en œuvre sont les intérêts majeurs de ce module merveilleux.
De plus, un code JavaScript contrairement au C++ n’a pas besoin d’être compilé ou recompilé.

2. Utilisation:

Pour l’utiliser il faut bien sur le déclarer:

 #include <QtScript>

En ayant pris soin de remplir le fichier de configuration (cf article précédent).

Le principe de ce module est de pouvoir utiliser n’importe quel SLOT du programme (que l’on retrouve dans le .h), donc n’importe qu’elle fonction avec ses différents paramètres. Les slots sont habituellement utilisés à la suite d’un signal, comme par exemple l’appui sur un bouton, mais nous allons les utiliser différemment. Niveau déclaration c’est ScriptEngine qu’il faut utiliser (engine pour “moteur” 😉 ).

m_engine = new QScriptEngine(this);             //constructeur

QScriptValue scriptBrowser = m_engine->newQObject(this);

//On déclare l’objet que l’on va rendre scriptable, ici “this” pour l’objet actuel, il est possible de scripter dans un object différent, comme si l’on choisi de créer une console de script par exemple qui aura comme paramètre l’object à scripter. (QScriptValue scriptBrowser = m_engine->newQObject(m_fenetre); )

QScriptValue global = m_engine->globalObject();

global.setProperty("mf" , scriptBrowser);

//Cette instanciation permet de rajouter le paramètre OBLIGATOIRE à l’objet lui permettant d’interpréter les slots en JavaScript, “mf” (que l’on peut appeler autrement si l’on veut) permettra d’appeler le slot dans le script: exemple: pour une fonction qui s’appel “void wait(int time);” dans le fichier JavaScript, son appel se fera par: mf.wait(100);

Exemple:

Programme C++ (.h)

programme.h
public slots:

void connect(const QString & m_host, const QString & m_login, const QString & m_pwd);

void disconnect(int id);

JavaScript (.js)

script.js ou encore mieux
mf.connect(“192.168.0.1”,”administrateur”,”password”);

mf.disconnect(0);

function connect(host,login,password) {

mf.connect(host,login,password)

}

connect(“192.168.0.1”,”admin”,”password”);

Il est possible de créer des fonctions, utiliser des opérateurs, des booléens et tous les objets disponible en JavaScript.

Pour exécuter le script et les différentes fonctions, on utilise “evaluate”:

QScriptValue function = m_engine->evaluate(file.readAll());    //file est ici le fichier script.js.

On peut “’évaluer” directement une fonction du fichier, en lui passant des paramètres :

QScriptValue sc1 = m_engine->evaluate(QString("connect(\"%1\",\"%2\",\”%3\”)").arg(host)

.arg(login).arg(pwd));

En ayant pris soin bien sur de “charger” le fichier en mémoire :

QFile file("./script.js");

file.open(QIODevice::ReadOnly);

QScriptValue script = m_engine->evaluate(file.readAll());

file.close();

En effet, on peut lire un fichier “.js” contenant les fonctions JavaScripts dans le constructeur,par exemple, et ensuite les utiliser à notre guise dans notre programme (utile en cas de programme asynchrone dans mon cas).

3. Petit plus:

Vous connaissez maintenant la base de ce module mais ce n’est pas tout, QtScript intègre également un débugger, permettant d’étudier le code (en cas d’erreur notamment).

image

Comme dans Visual Studio, on peut mettre des points d’arrêts, faire du pas à pas, voir l’état des variables et renvoyer les erreurs éventuelles.

Pour ce faire :

m_debugger = new QScriptEngineDebugger(this);

m_debugger->attachTo(m_engine);

m_debugWindow = m_debugger->standardWindow();

m_debugWindow->setWindowModality(Qt::ApplicationModal);

m_debugWindow->resize(1280, 704);

En cas d’erreurs, la fenêtre s’ouvre avec la ligne (en rouge) qui pose problème :

image

Oups ! erreur de frappe 😉

4. Exemple:

Pour finir, voici un cas concret de mon nouveau programme 🙂 :

L’application est maintenant extensible sans avoir à recompiler le code !

image

Et voila le travail:

image

Dans un prochain article, je rentrerai un peu plus dans le sujet, avec un programme plus élaboré, une console de scripting, la gestion du débogage. Je vous montrerais pourquoi ce module est super puissant !

A vos programmes 😉

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :