QScriptEngine et opération sur classe
Salut!
Je viens vers vous concernant QScriptEngine.
J'ai defini une classe MyClass avec l operateur "+":
Code:
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) |
Test 1:
Donc le code suivant, fonctionne:
Code:
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:
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:
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,