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,