0

假设我有简单的 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() 与对象验证
  • 在 timerFunction() 中我调用 JS 函数并返回结果
  • 之后我继续执行 timerFunction()

所以我的问题 - 有没有办法从 C++ 插件对象调用 JS 函数?

4

1 回答 1

2

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

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

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

于 2014-03-13T18:34:19.157 回答