2013-04-01 45 views
1

我想從C++執行匿名Qt腳本函數,但無法找出要使用的QScriptContext。匿名qt腳本函數的上下文?

這裏的腳本:

{ 
    otherObject.Text = "Hello World"; 
    setTimeout(function(otherObject) { otherObject.Text = "Goodbye World"; }, 9000); 
} 

下面是在C的setTimeout方法++:

QScriptValue setTimeout(QScriptContext* ctx, QScriptEngine* eng) 
{ 
    // How can I obtain the correct context and arg list for the anonymous function here? 
} 

的QScriptValue對象的調用方法需要上下文和參數列表:

call(ctx->thisObject(), ctx->argumentsObject()); 

編輯:上下文可以是全局上下文,但構建參數列表來調用func這似乎是問題的癥結所在。我沒有看到任何解釋如何從C++構建「參數對象」的東西。有一個名爲「參數」的屬性,但它似乎沒有填寫,或者我還沒有弄清楚如何使用它。

回答

2

如果我們只看這段JavaScript代碼:

{ 
    otherObject.Text = "Hello World"; 
    setTimeout(function(otherObject) { otherObject.Text = "Goodbye World"; }, 9000); 
} 

的setTimeout被告知要等到9000,然後調用一個匿名函數。但是,問題是匿名函數有一個參數。 setTimeout函數不知道傳遞給函數的參數。

<html> 
<script> 
var otherObject = 'Hello World'; 
setTimeout(function(otherObject){alert(otherObject);}, 1000); 
</script> 
</html> 

如果您嘗試在Chrome的代碼,它會提醒不確定的,因爲setTimeout函數不知道該怎麼傳遞給匿名函數,它只是傳遞沒有參數。

但如果你試試這個:

<html> 
<script> 
var otherObject = 'Hello World'; 
setTimeout(function(){alert(otherObject);}, 1000); 
</script> 
</html> 

這將提醒世界,你好,因爲現在otherObject不再是參數的匿名功能,但其與匿名函數的蓋的局部變量。

因此,爲了使您的代碼工作,setTimeout函數應該不同於瀏覽器的setTimeout函數。如果你想設置爲從C++側匿名函數的參數,這裏是你可以做什麼:

QScriptValue setTimeout(QScriptContext* ctx, QScriptEngine* eng) 
{ 
    QScriptValue anonymous_callback = ctx->argument(0); 
    QScriptValue time = ctx->argument(1); 
    QThread::sleep(time.toInt32()) 
    // Then Invoke the anonymous function: 
    QScriptValueList args; 
    otherObjectProto * otherObjectQtSide = new otherObjectProto(); 
    otherObjectQtSide.setProperty("Text","Goodbye World!"); 
    QScriptValue otherObject = engine->newQObject(otherObjectQtSide);// engine is pointer to the QScriptEngine instance 
    args << otherObject; 
    anonymous_callback.call(QScriptValue(),args); 
} 

爲了簡單起見,有三件事情我不包括:

  1. otherObjectProto未實現。以here爲例。

  2. QThread :: sleep會阻塞當前線程,這可能不是所期望的,但可以很容易地使用QTimer進行異步修改。

  3. engine-> newQObject有其他的參數,它定義了QObject的所有權,如果你不想內存泄漏,更好地閱讀它。

+0

我通過爲每個setTimeout調用創建一個子對象來實現定時器功能。在構造函數中,它調用startTimer(delay)。在定時器事件處理程序中,它調用匿名函數。完成後,它會調用killTimer()和deleteLater()。我認爲這會讓我擁有儘可能多的計時器,並且會在我自己之後清理乾淨。 – Jay

+0

優秀的寫作。獎勵! – Jay