2014-03-13 77 views
0

假設我有一個簡單的QML插件。定期檢查我的對象的一些狀態,在這一步,我想查詢從C++的QML對象,以這樣的方式從C++插件調用QML中的JS函數

插件代碼(C++)

class MyItem : public QQuickItem 
{ 
public: 
    MyItem(QQuickItem *parent = 0) : 
     QQuickItem(parent) 
    {} 
    void timerFunction(SomeObject * obj) 
    { 
     // here I need to call QML function to validate my object, may be in this way: 
     callJSFunction("myFunction",obj); // that's what I need 
     if(obj->approved) doSomething(); 
    } 
} 

QML文件:

MyItem { 
    id: myItem 
    property bool someProperty 
    function myFunction(obj) 
    { 
     obj.approved = someProperty; 
    } 
} 

因爲調用JS必須以同步方式進行,所以我不能使用信號。我的意思是我需要的是:

    在C
  • ++代碼計時器調用與對象的功能timerFunction()來驗證
  • 內timerFunction()我調用JS功能,並得到結果返回
  • 它後,我繼續執行timerFunction()

所以我的問題 - 有沒有辦法從C++插件對象調用JS函數?

回答

2

我不能使用信號只是因爲調用JS必須以同步的方式。

默認情況下,Qt中的信號實際上是同步的。當您發出信號時,所有連接的插槽都會立即被調用,並且只有在所有插槽已執行時纔會返回emit語句。 因此,在你的情況下,使MyItem發出一個信號,並在QML中連接到該信號。 (唯一的例外是多線程代碼,但我假設你的MyItem實例與QML引擎位於同一線程中)

你當然可以用相反的方法來調用C++的JS函數。我會主張反對,因爲它打破了分層--QML層應該訪問C++層,而不是相反。 無論如何,要從C++調用JS函數,請使用QMetaObject::invokeMethod。有關詳細信息,請查看有關Interacting with QML Objects from C++的文檔。

+0

謝謝@tmcguire!我一直認爲信號是異步的。如果我錯了,那麼我的問題就解決了。 – folibis