在求值之前设置QScriptValue-local值
Setting QScriptValue-local values prior to evaluating
本文关键字:设置 QScriptValue-local 更新时间:2023-10-16
是否有可能,在Qt 4.8中,从c++端,在QScriptEngine
中设置QScriptValue
-local值?
例如,假设我有:
QScriptEngine engine;
engine.globalObject().setProperty("glob", 1000);
// ???: Set loc to, say, 42.
QScriptValue expr1 = engine.evaluate("glob + loc");
qDebug() << expr1.toNumber();
// ???: Set loc to, say, 99.
QScriptValue expr2 = engine.evaluate("glob + loc");
qDebug() << expr2.toNumber();
我希望它的输出是:
1042
1099
对于上面这个人为的例子,显而易见的解决方案是让"loc"全局化,并相应地设置和重置它,但由于分散了这个问题的原因,这不是我想要的。我想:- "loc"是本地的每个
QScriptValue
- 不要人为地修改脚本字符串,例如在脚本前添加
QString().sprintf("loc = %d;", 42)
或其他内容。 - 只使用一个
QScriptEngine
.
我唯一能想到的是:
QScriptValue expr1 = engine.evaluate("glob + loc");
expr1.setProperty("loc", 42);
qDebug() << expr1.toNumber();
但是这个值似乎已经被evaluate()
完全计算过了,所以setProperty()
没有影响(不奇怪)。
我也偷看了一下QScriptProgram
,希望它能提供一个程序本地环境,但是唉。
我正在查看文档,并将在我发布这篇文章后继续查看它们,但这是我第一次使用QScriptEngine
,我必须承认我的大脑正在变成糊状,所以我很抱歉如果它就在那里并且完全明显。我将接受RTFM作为有效的答案。
我明白了,至少我认为这是最好的方法。关键是QScriptEngine#pushContext()
和#popContext()
:
QScriptEngine engine;
engine.globalObject().setProperty("glob", 1000);
QScriptContext *local;
local = engine.pushContext();
local->activationObject().setProperty("loc", 42);
QScriptValue expr1 = engine.evaluate("glob + loc");
engine.popContext();
qDebug() << expr1.toNumber();
local = engine.pushContext();
local->activationObject().setProperty("loc", 99);
QScriptValue expr2 = engine.evaluate("glob + loc");
engine.popContext();
qDebug() << expr2.toNumber();
只要给定的QScriptContext
在堆栈上是活动的,所有QScriptValue
的计算都将使用它。已存在的同名变量将被后续上下文覆盖。
我猜需要注意的是你必须让push →所有评估→如果要使用多个线程和一个引擎,请使用原子计算,而不是单独计算。我希望有一种方法来传递上下文到evaluate()
.
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 将特征矩阵的向量设置为0
- 在求值之前设置QScriptValue-local值