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 );
替换赋值(=
)。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- Java本机接口(JNI)是否受到c++ ABI兼容性问题的影响
- perror()调用影响信号量锁定/解锁的问题
- QtScript中变量影响问题