Salut!
Je viens vers vous concernant QScriptEngine.
J'ai defini une classe MyClass avec l operateur "+":
Test 1:
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 ©); 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 ©) { 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)
Donc le code suivant, fonctionne:
J'essaie de faire la meme chose mais avec Qt Script.
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
La solution est d'utiliser QVariant() (ca fonctionne avec Q_DECLARE_METATYPE).
Test 2:
Donc le code suivant fonctionne (j evalue "A" tout seul):
Test 3:
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
Par contre, si je tente d'utiliser l operator +, ca ne fonctionne pas.
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?
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
Merci pour vos lumières!
Cordialement,
Partager