Проблема в влиянии переменных в QtScript - PullRequest
1 голос
/ 20 апреля 2011

Я пытаюсь получить результат простой операции сценария на стороне C ++.

Я создаю QScriptValue (myvar) и вызываю engine.globalObject().setProperty("result", myvar); Затем я оцениваю "result = anothervar + 7;"Возвращаемое значение метода оценки в порядке, но результат переменной не в порядке.Если сценарий "result = anothervar + 7; a = 1", тогда значение результата в порядке.

Это выглядит слишком глупо, чтобы быть ошибкой Qt, так что я пропустил?

Спасибо

Джефф

1 Ответ

0 голосов
/ 20 апреля 2011

Из вашего ответа на мой комментарий я предполагаю, что вы сохраняете экземпляр QScriptValue myvar и посмотрите на него после вызова evaluate():

QScriptEngine e;
QScriptValue myvar( 1.0 );
e.globalObject().setProperty( "result", myvar );
e.globalObject().setProperty( "anotherVar", QScriptValue( 14 ) );
const QScriptValue s = e.evaluate( "result = anotherVar + 7;" );
qDebug() << s.toVariant();
qDebug() << e.globalObject().property("result").toVariant();
qDebug() << myvar.toVariant();

Это напечатает 2x «QVariant (double, 21)» и один раз «QVariant (double, 1)». Это ожидаемое поведение, вот почему:

В JavaScript все является объектом, и вы имеете дело только с ссылками на объекты, а не на сами объекты (если вы знаете Java, это похоже на int против Integer) , Таким образом, присваивание result = anotherVar + 7; заменяет объект, представленный myvar как свойство «результата» глобального объекта, объектом, который получается из выражения anotherVar + 7. Между тем, QScriptValue myvar все еще ссылается на (старый) объект, который в противном случае был бы доступен для сборщика мусора.

О добавлении a=1 для решения проблемы: я не могу воспроизвести это здесь. Первый оператор отладки печатает значение a, конечно, но второй и третий неизменны.

Поэтому решение вашей проблемы состоит в том, чтобы всегда получать свойство «result» из движка всякий раз, когда вам это нужно (используя engine.globalObject().property("result")), или, другими словами, QScriptValue не отслеживает назначения.

Если вы делаете хотите отслеживать назначение, вам нужно превратить его в вызов метода: реализовать result как пользовательский класс с методом assign() и заменить назначение (=) с result.assign( anotherVal + 7 );.

...