QScriptEngine有evaluate()方法,可用於加載腳本,執行腳本並從已加載的腳本運行指定的函數。但是,如何清除當前腳本並加載新腳本?例如,我使用evaluate()從文件加載腳本,然後使用evaluate()來獲取腳本函數並調用它們。但我能做些什麼來清除當前腳本並從另一個文件加載新腳本?刪除和創建QScriptEngine看起來像是一種解決方案,但它喜歡在GUI線程中創建(由於QScriptEngineDebugger),而所有腳本操作都是在單獨的線程中執行的。那麼是否有什麼方法可以在不重新創建QScriptEngine對象的情況下清除當前腳本?QtScript:如何重新加載當前腳本?
4
A
回答
2
我遇到了這個問題,並想改善地獄之眼的答案(順便說一句,謝謝),因爲它遺漏了一個重要的細節。
我將使用我的問題的減少版本,在那裏我重新使用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::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;
}
變化的像素圖,爲裝備精靈手槍
0
你可以嘗試一個空的對象設置爲http://qt.nokia.com/doc/4.6/qscriptengine.html#setGlobalObject
也許這工作。
7
engine.pushContext();
engine.evaluate("...");
engine.popContext();
engine.pushContext();
engine.evaluate("...");
engine.popContext();
在評估腳本和在評估新腳本之前調用popContext()之前調用pushContext()將有效地清除所有腳本數據。
相關問題
- 1. 如何重新加載當前UIView
- 2. 如何重新加載腳本標記
- 3. 如何重新加載Python腳本
- 4. 如何使Firebug重新加載腳本?
- 5. 如何防止腳本更改window.location或在當前頁面上重新加載?
- 6. 角度重新加載當前路徑並重新加載當前模板
- 7. 如何強制重新加載腳本並重新執行?
- 8. 停止此腳本重新加載頁面重新加載
- 9. 如何在Rails Minitest中刷新(重新加載)當前網址?
- 10. 重新加載AS2中的當前幀?
- 11. Laravel Carbon - 重新加載當前時間
- 12. Location.href只是重新加載當前頁
- 13. 當AJAX更改URL而不重新加載頁面時,如何重新加載Greasemonkey腳本?
- 14. 如何替換(重新執行)當前腳本函數?
- 15. 如何獲取當前加載的腳本的src?
- 16. 重新加載CHROME的擴展腳本?
- 17. .bashrc不能從腳本重新加載
- 18. PHP CLI - STDIN - 或 - 重新加載腳本
- 19. PHP腳本,重新加載頁面
- 20. 點擊重新加載腳本
- 21. Ember重新加載佈局腳本
- 22. 重新加載內容腳本
- 23. mysql腳本只能重新加載
- 24. 螢火蟲腳本重新加載
- 25. 如何在配置更改後重新加載當前路由?
- 26. 如何使用SharedObject保存並重新加載當前幀
- 27. 如何在Ruby on Rails中重新加載當前頁面?
- 28. 如何在Express.js中重新加載當前頁面?
- 29. 如何在Ember.js中重新加載當前路由?
- 30. 如何重新加載的Windows Phone 7.5在當前頁?
全局對象只是定義了什麼「這」將引用內部腳本:(。它沒有連接到腳本代碼本身 – grigoryvp 2010-01-11 12:20:06
你至少試一試呢?至於我記得,功能是該對象的一部分。 – guruz 2010-01-11 13:24:48
QT函數可用於腳本,而不是腳本函數。 – grigoryvp 2010-01-11 16:47:13