IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

[QtScript] Rendre une classe accessible depuis le script


Sujet :

Qt

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut [QtScript] Rendre une classe accessible depuis le script
    Bonjour,

    J'essaie de rendre une partie de mon application scriptable.

    J'ai déjà de quoi instancier et exécuter des scripts, récupérer les valeurs de retour, accéder aux propriétés de mes QObject, tout ça...

    Mais je n'arrive pas à "binder" mes classes C++

    Par exemple, j'ai une classe "vecteur" qui représente un vecteur en 3D (mais ce n'est pas un QObject)

    Je souhaite pouvoir écrire un script de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var test = new vecteur();
    test.x = 1.0;
    test.y = 5.0;
    test.z = 10.0;
    var test2 = test.normalize()
    test2 = test2.rotate(90.0)
    ...
    Pour ça j'ai besoin de "binder" ma classe "vecteur" et ses méthodes.

    J'ai essayé en suivant cet exemple :http://doc.qt.nokia.com/stable/script-customclass.html

    Mais je n'arrive pas à le faire fonctionner... quelqu'un aurait-il des liens vers des exemples/tutoriels ?

    J'ai beaucoup de mal à en trouver...

    Merci.

  2. #2
    Membre confirmé

    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Points : 490
    Points
    490
    Par défaut
    Salut,

    Il me semble que dans l'exemple, la classe à scripter hérite de QObject ce qui simplifie les choses et qui explique peut-être pourquoi ça ne marche pas chez toi.
    Sinon, il y a un projet assez intéressant
    http://code.google.com/p/qtscriptgenerator/
    qui fait un bind de tout Qt dans QtSript.

    J'ai voulu faire la même chose que toi et en gros, je suis arrivé à la conclusion que si ça n'hérite pas de QObject, c'est trop compliqué à faire (regarde le code de qtscriptgenerator et tu comprendras).

    En ésperant que ça t'aide.

    G.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Salut,

    Merci pour la réponse, mais je ne peux pas heriter de QObject car j'ai besoin de binder des classes qui proviennent d'une librairie tierce dont je n'ai ps les sources.

    Toute la partie du binding qui concerne mon application est faite à base de QObject, ça roule nickel.

    Pour l'autre partie, j'essaie d'implementer des QtScriptClass et des prototypes QtScript, mais ça ne marche qu'en partie et je ne comprend pas pourquoi.

    Vu qu'il est difficile de trouver des infos sur le net à ce propos, c'est un peu galère...

    Et merci pour le lien, très intéressant !

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    Il suffit d'utiliser un design pattern wrapper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    struct A { // qui n'hérite pas de QObject
       A() {}
       void foo1() {}
       int foo2(int x, int y) {}
       float z;
    };
     
    struct AScriptable : public QObject {
       // qui hérite de QObject et donc utilisable dans les scripts
       AScriptable() : QObject() {}
     
    public slots: // fonctions accessibles dans les scripts
       void foo1() { a.fooA(); }
       int foo2(int x, int y) { return a.foo2(x, y); }
     
    // accès aux variables membres
       Q_PROPERTY(qreal z READ getZ WRITE setZ)
       qreal getZ() { return static_cast<qreal>(a.z); }
       void setZ(qreal v) { a.z = static_cast<float>(v); }
     
    private:
       A a; // composition avec A mais il est possible d'utiliser une agrégation (pointeur) ou l'héritage multiple
    };
    Par exemple

  5. #5
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Je ne crois pas que cela permette de faire :

    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var truc = new AScriptable();
    dans un script.

    Encore moins avec des arguments....

    C'est pour cela que j'essaie de définir convenablement des QScriptClass de binding et les prototypes associés.

Discussions similaires

  1. Rendre une VM accessible depuis mon réseau local
    Par Qolizion dans le forum VirtualBox
    Réponses: 3
    Dernier message: 13/04/2015, 14h06
  2. Réponses: 3
    Dernier message: 24/06/2009, 17h59
  3. Comment rendre ma page accessible depuis une recherche Google ?
    Par Midou45 dans le forum Référencement
    Réponses: 7
    Dernier message: 04/07/2008, 13h40
  4. Réponses: 2
    Dernier message: 08/03/2007, 10h50
  5. Réponses: 2
    Dernier message: 15/08/2005, 20h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo