Я столкнулся с этой проблемой и хотел бы улучшить ответ «Глаза ада» (спасибо, кстати!), Так как он не учитывает важную деталь.
Я буду использовать урезанную версию своей проблемы, где я повторно использую объект QScriptEngine
и хочу убедиться, что между оценками ничего не осталось. В частности, я хотел убедиться, что функция onEquipped
не была вызвана для сущности "RC Helicopter Controller"
, так как она не меняет свой спрайт, когда она оборудована, и, следовательно, не определяет функцию onEquipped
в своем файле сценария. , Простое использование pushContext()
и popContext()
приводит к тому, что вообще ничего не вызывается:
#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 to equipped sprite for ' + 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;
}
Вызов функции происходит в исходном контексте, а не в текущем. Просматривая документацию QScriptEngine :: pushContext () , я обнаружил, что вам нужно явно использовать возвращаемый из нее контекст, и, кроме того, вы должны использовать QScriptEngine :: активацииContext () для доступа к любым переменным:
#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 to equipped sprite for ' + 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;
}
изменение растрового изображения на экипированный спрайт для пистолета