2010-01-11 49 views
4

QScriptEngine有evaluate()方法,可用於加載腳本,執行腳本並從已加載的腳本運行指定的函數。但是,如何清除當前腳本並加載新腳本?例如,我使用evaluate()從文件加載腳本,然後使用evaluate()來獲取腳本函數並調用它們。但我能做些什麼來清除當前腳本並從另一個文件加載新腳本?刪除和創建QScriptEngine看起來像是一種解決方案,但它喜歡在GUI線程中創建(由於QScriptEngineDebugger),而所有腳本操作都是在單獨的線程中執行的。那麼是否有什麼方法可以在不重新創建QScriptEngine對象的情況下清除當前腳本?QtScript:如何重新加載當前腳本?

回答

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

也許這工作。

+0

全局對象只是定義了什麼「這」將引用內部腳本:(。它沒有連接到腳本代碼本身 – grigoryvp 2010-01-11 12:20:06

+0

你至少試一試呢?至於我記得,功能是該對象的一部分。 – guruz 2010-01-11 13:24:48

+0

QT函數可用於腳本,而不是腳本函數。 – grigoryvp 2010-01-11 16:47:13

7
engine.pushContext(); 
engine.evaluate("..."); 
engine.popContext(); 
engine.pushContext(); 
engine.evaluate("..."); 
engine.popContext(); 

在評估腳本和在評估新腳本之前調用popContext()之前調用pushContext()將有效地清除所有腳本數據。