QtScript中变量影响问题

Problem in variable affectation in QtScript

本文关键字:问题 影响 变量 QtScript      更新时间:2023-09-26

我试图在c++端获得脚本简单操作的结果。

我创建了一个QScriptValue (myvar)并调用engine.globalObject().setProperty("result", myvar);然后我计算"result = anothervar + 7;"evaluate方法的返回值是OK的,但是变量的结果不是OK的。如果脚本是"result = anothervar + 7;a=1"则结果值为OK。

它看起来太蠢了,不可能是Qt的bug,所以我错过了什么?

感谢杰夫

从您对我的评论的回答来看,我假设您保留了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();

这将打印两次"QVariant(double,21)"和一次"QVariant(double,1)"。这是预期的行为,原因如下:

在JavaScript中,一切都是对象,并且您只处理对对象的引用,而不是对象本身(如果您了解Java,这类似于intInteger)。因此,赋值result = anotherVar + 7;所做的是将由myvar表示的对象替换为全局对象的"result"属性,并使用表达式anotherVar + 7产生的对象。同时,QScriptValue myvar仍然引用(旧的)对象,否则此时该对象将被垃圾收集器捕获。

关于添加a=1来解决问题:我无法在这里复制。当然,第一个调试语句打印a的值,但是第二个和第三个语句没有改变。

你的问题的解决方案,因此,总是重新获得"结果"属性从引擎每当你需要它(使用engine.globalObject().property("result")),或者换句话说,qscriptvalue不跟踪分配。

如果你想要跟踪赋值,你需要把它变成一个方法调用:用assign()方法实现result作为一个自定义类,用result.assign( anotherVal + 7 );替换赋值(=)。