QtScript中变量影响问题
Problem in variable affectation in QtScript
我试图在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,这类似于int
与Integer
)。因此,赋值result = anotherVar + 7;
所做的是将由myvar
表示的对象替换为全局对象的"result"属性,并使用表达式anotherVar + 7
产生的对象。同时,QScriptValue myvar
仍然引用(旧的)对象,否则此时该对象将被垃圾收集器捕获。
关于添加a=1
来解决问题:我无法在这里复制。当然,第一个调试语句打印a
的值,但是第二个和第三个语句没有改变。
你的问题的解决方案,因此,总是重新获得"结果"属性从引擎每当你需要它(使用engine.globalObject().property("result")
),或者换句话说,qscriptvalue不跟踪分配。
如果你想要跟踪赋值,你需要把它变成一个方法调用:用assign()
方法实现result
作为一个自定义类,用result.assign( anotherVal + 7 );
替换赋值(=
)。
- 在指令控制器中使用$attrs时出现问题
- 将PHP变量传递给jQuery时遇到问题
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- 参数变量出现ngTable指令问题
- 剑道网格jQuery动画()问题
- 我的jQuery插件参数没有正确启动,遇到了问题
- Phonegap-(安卓/iphone)多个图像的图像库出现问题
- TableExport jquery插件:文件名和扩展名问题
- JavaScript Pub/Sub属性访问问题
- JavaScript异步问题
- 如何解决Yii中的页面刷新问题
- Safari(Mac OS)上的jQuery平滑滚动问题
- jqGrid树网格问题
- 鼠标悬停事件影响列表中所有行中的按钮,而不仅仅是特定按钮
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 使用正则表达式评估电子邮件地址时出现性能问题
- 如何消除代码中的未定义和其他问题
- JavaScript代码问题:我正在将对象转换为数组
- 变量影响或 IF 语句 IE 问题
- QtScript中变量影响问题