QScriptEngine には、スクリプトをロードして実行し、すでにロードされているスクリプトから指定された関数を実行するために使用できる evaluate() メソッドがあります。しかし、現在のスクリプトをクリアして新しいスクリプトをロードする方法は? たとえば、evaluate() を使用してファイルからスクリプトをロードし、evaluate() を使用してスクリプト関数を取得して呼び出します。しかし、現在のスクリプトをクリアして、別のファイルから新しいスクリプトをロードするにはどうすればよいですか? QScriptEngine の削除と作成は解決策のように思えますが、(QScriptEngineDebugger のため) GUI スレッドで作成するのが好きですが、すべてのスクリプト操作は別のスレッドで実行されます。QScriptEngine オブジェクトを再作成せずに現在のスクリプトをクリアする方法はありますか?
3 に答える
engine.pushContext();
engine.evaluate("...");
engine.popContext();
engine.pushContext();
engine.evaluate("...");
engine.popContext();
スクリプトを評価する前に pushContext() を呼び出し、新しいスクリプトを評価する前に popContext() を呼び出すと、すべてのスクリプト データが効果的に消去されます。
私はこの問題に遭遇し、重要な詳細が省略されているため、Eye of Hellの回答を改善したいと思います(ちなみにありがとう!)。
QScriptEngine
オブジェクトを再利用し、評価の間に何も残さないようにするために、私の問題の縮小バージョンを使用します。特に、エンティティが装備されているときにスプライトを変更せず、スクリプト ファイルで関数を定義しないため、関数がエンティティonEquipped
に対して呼び出されないようにしたかったのです。andを使用するだけで、何も呼び出されません。"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::activationContext()を使用する必要があります。
#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;
}
ピストルのピックスマップを装備スプライトに変更
空のオブジェクトをhttp://qt.nokia.com/doc/4.6/qscriptengine.html#setGlobalObjectに設定してみてください。
多分それはうまくいきます。