qt - QtScript: how to reload current script? -
qscriptengine has evaluate() method can used load script, execute , run specified function loaded script. how clear current script , load new one? example, use evaluate() load script file , evaluate() script functions , call them. can clear current script , load new 1 different file? deleting , creating qscriptengine seems solution, likes created in gui thread (due qscriptenginedebugger) while script operations performed in separate thread. way clear current script without re-creating qscriptengine object?
i ran problem, , improve eye of hell's answer (thanks, way!), leaves out important detail.
i'll use cut down version of problem, reusing qscriptengine
object , wanted ensure nothing left behind between evaluations. in particular, wanted ensure onequipped
function not called "rc helicopter controller"
entity, doesn't change sprite when equipped , hence doesn't define onequipped
function in script file. using pushcontext()
, popcontext()
results in nothing being called @ all:
#include <qtcore> #include <qtscript> int main(int argc, char *argv[]) { qcoreapplication app(argc, argv); qscriptengine scriptengine; scriptengine.pushcontext(); scriptengine.evaluate("function onequipped(entity) { print('changing pixmap equipped sprite ' + entity); }").tostring(); qscriptvaluelist args; args << qscriptvalue("pistol"); scriptengine.globalobject().property("onequipped").call(qscriptvalue(), args); scriptengine.popcontext(); scriptengine.pushcontext(); args.clear(); args << qscriptvalue("rc helicopter controller"); scriptengine.globalobject().property("onequipped").call(qscriptvalue(), args); scriptengine.popcontext(); return 0; }
the function call seems happen on original context, not current one. upon looking @ qscriptengine::pushcontext() documentation, saw need explicitly use context returned it, , on top of that, must use qscriptengine::activationcontext() access variables:
#include <qtcore> #include <qtscript> int main(int argc, char *argv[]) { qcoreapplication app(argc, argv); qscriptengine scriptengine; scriptengine.pushcontext(); scriptengine.evaluate("function onequipped(entity) { print('changing pixmap equipped sprite ' + entity); }").tostring(); qscriptvaluelist args; args << qscriptvalue("pistol"); scriptengine.currentcontext()->activationobject().property("onequipped").call(qscriptvalue(), args); scriptengine.popcontext(); scriptengine.pushcontext(); args.clear(); args << qscriptvalue("rc helicopter controller"); scriptengine.currentcontext()->activationobject().property("onequipped").call(qscriptvalue(), args); scriptengine.popcontext(); return 0; }
changing pixmap equipped sprite pistol
Comments
Post a Comment