假设我有简单的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 ++插件对象调用JS函数?
答案 0 :(得分:2)
我不能仅仅因为调用JS必须以同步方式使用信号。
默认情况下,Qt中的信号实际上是同步的。当您发出信号时,会立即调用所有连接的插槽,并且只有当所有插槽都已执行时,emit语句才会返回。
所以在你的情况下,让MyItem
发出一个信号并用QML连接到那个信号。
(唯一的例外是多线程代码,但我假设您的MyItem
实例与QML引擎位于同一个线程中)
你当然可以反过来做,并从C ++调用JS函数。我主张反对,因为它打破了分层 - QML层应该访问C ++层,而不是反过来。 无论如何,要从C ++调用JS函数,请使用QMetaObject::invokeMethod。有关完整详细信息,请查看有关Interacting with QML Objects from C++的文档。