从c ++插件调用QML中的JS函数

时间:2014-03-13 11:10:15

标签: c++ plugins qml qquickitem

假设我有简单的QML插件。我定期检查我的对象的某些状态,在这一步中,我想以这种方式从c ++查询QML对象:

插件代码(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()并使用对象进行验证
  • inside timerFunction()我调用JS函数并返回结果
  • 之后我继续执行timerFunction()

所以我的问题 - 是否有某种方法可以从C ++插件对象调用JS函数?

1 个答案:

答案 0 :(得分:2)

  

我不能仅仅因为调用JS必须以同步方式使用信号。

默认情况下,Qt中的信号实际上是同步的。当您发出信号时,会立即调用所有连接的插槽,并且只有当所有插槽都已执行时,emit语句才会返回。 所以在你的情况下,让MyItem发出一个信号并用QML连接到那个信号。 (唯一的例外是多线程代码,但我假设您的MyItem实例与QML引擎位于同一个线程中)

你当然可以反过来做,并从C ++调用JS函数。我主张反对,因为它打破了分层 - QML层应该访问C ++层,而不是反过来。 无论如何,要从C ++调用JS函数,请使用QMetaObject::invokeMethod。有关完整详细信息,请查看有关Interacting with QML Objects from C++的文档。