2014-03-13 40 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