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 :

QScriptEngine et opération sur classe


Sujet :

Qt

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut QScriptEngine et opération sur classe
    Salut!

    Je viens vers vous concernant QScriptEngine.

    J'ai defini une classe MyClass avec l operateur "+":
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    class MyClass
    {
    public:
        MyClass();
        MyClass(const double &value);
        MyClass(const MyClass &copy);
        MyClass operator+(const double &value);
        MyClass operator+(const QVariant &value);
        double m_value;
     
    };
     
    MyClass::MyClass()
    {
    }
     
    MyClass::MyClass(const double &value)
    {
        m_value = value;
    }
     
    MyClass::MyClass(const MyClass &copy)
    {
        m_value = copy.m_value;
    }
     
    MyClass MyClass::operator+(const double &value)
    {
        qDebug() << "MyClass::operator+ double";
        return MyClass(this->m_value + value);
    }
     
    MyClass MyClass::operator+(const QVariant &value)
    {
        qDebug() << "MyClass::operator+ QVariant";
        return MyClass(this->m_value + value.toDouble());
    }
     
    // cette ligne permet d utiliser QVariant avec MyClass
    Q_DECLARE_METATYPE(MyClass)
    Test 1:
    Donc le code suivant, fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        MyClass inputB;
        inputB.m_value = 6;
        MyClass outputB;
        outputB = inputB+5;
        qDebug() << "input : " << inputB.m_value; // affiche 6
        qDebug() << "output: " << outputB.m_value; // affiche 11
    J'essaie de faire la meme chose mais avec Qt Script.
    La solution est d'utiliser QVariant() (ca fonctionne avec Q_DECLARE_METATYPE).

    Test 2:
    Donc le code suivant fonctionne (j evalue "A" tout seul):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        QScriptEngine engine;
        QScriptValue inputValue = engine.newVariant(QVariant::fromValue(inputB));
        engine.globalObject().setProperty("A",inputValue);
        outputB = engine.evaluate("A").toVariant().value<MyClass>();
        qDebug() << "input : " << inputB.m_value; // affiche 6
        qDebug() << "output: " << outputB.m_value; // affiche 6
    Test 3:
    Par contre, si je tente d'utiliser l operator +, ca ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        QScriptEngine engine;
        QScriptValue inputValue = engine.newVariant(QVariant::fromValue(inputB));
        engine.globalObject().setProperty("A",inputValue);
        outputB = engine.evaluate("A+1").toVariant().value<MyClass>();
        qDebug() << "input : " << inputB.m_value; // affiche 6
        qDebug() << "output: " << outputB.m_value; // affiche 1.7952e-313 ou similaire
    Je remarque que l’opérateur "MyClass::operator+(const QVariant &value)" n'est pas appelé dans le Test 3. Comment fonctionne l’évaluation en interne? Je suppose que c'est du au fait que QVariant utilise l'adresse. Mais alors, quelle est la solution?

    Merci pour vos lumières!
    Cordialement,

  2. #2
    Membre confirmé

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

    Ton operateur + ne peut pas marcher dans l'evaluateur de scripte car il n'est pas tagé Q_SLOT slot ou Q_INVOKABLE. (Il me semble que ça ne marche pas sur les operateurs de toute façon).
    Ta classe n'hérite pas de QObject d'ailleurs.
    Essaye de regarder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QScriptEngine::hasUncaughtException()
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QScriptValue::isError()
    pour avoir plus de détails sur ce qui ne marche pas.

    MG.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Je ne suis pas fan de QObject dans ce cas.
    J'ai quand meme fait un essai mais ce n'est pas concluant.
    Je suis un peu déçu de la capacité de QtScript.
    Le fonctionnement est un peu nébuleux. En plus, j'ai peur des copies en interne. L'utilisation de QVariant n'aide pas! Ca fait poupées russes entre ma classe, le QVariant et le fonctionnement interne QtScript...

    Avant de découvrir QtScript, j'avais fait une classe d’interprétation de chaines basé sur "Reverse Polish notation" avec des fonctions et des variables. Pour finir, il fonctionne bien mieux. Mon but était le calcul d'expression avec la librairie armadillo. Ma solution boiteuse devrait être suffisante.

    Merci quand même!

  4. #4
    Membre confirmé

    Inscrit en
    Décembre 2009
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 170
    Par défaut
    Il y a un projet pas mal http://qt.gitorious.org/qt-labs/qtscriptgenerator qui permet de binder des types basiques (ceux de Qt du genre QPoint, QRect ...) sans avoir à hériter de QObject. Si tu as du temps, tu peux y jetter un coup d'oeil et t'en inspirer.
    Mais c'est vrai que QtScript est utilisé étroitement avec les objets Qt. Personnellement je l'utilise principalement pour mes tests automatiques et ça marche plutôt bien. Tout dépend ce que tu veux faire après.

    Pour la duplications des données, tu peux utiliser des pointeurs sur les données de tes classes, ça évitera de les dupliquer. Et si tu as le temps aussi, tu peux utliser le mécanismes de partage implicite pour robustifier ton code.

    MG.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Merci pour les precisions.

    J'avais déjà testé avec les pointeurs avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Q_DECLARE_METATYPE(double*)
    Je n'ai malheureusement pas trouvé de solution viable.

    Je vais plutôt utiliser ma classe d interprétation, elle est simple et rapide (à condition que l'interpretation reste juste ). Je peux revenir la poster quand elle fonctionnera pile poil.

    Par contre, ta remarque sur le partage implicite m'interresse fortement apres avoir lu quelques articles. Je vais creuser cette remarque qui peut être utile!

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Evenement sur classe virtual
    Par papouAlain dans le forum Windows Forms
    Réponses: 26
    Dernier message: 11/01/2005, 11h45
  2. opération sur fermeture de fenêtre
    Par java_math dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 20/06/2004, 22h52
  3. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07
  4. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

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