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

C++ 从c+;调用QML中的JS函数+;插件,c++,plugins,qml,qquickitem,C++,Plugins,Qml,Qquickitem,假设我有一个简单的QML插件。定期检查对象的一些状态,在这个步骤中,我想从C++查询QML对象,这样: 插件代码(c++) 类MyItem:公共QQuickItem { 公众: MyItem(QQuickItem*父项=0): QQuickItem(父项) {} void timer函数(SomeObject*obj) { //这里我需要调用QML函数来验证我的对象,可能是这样的: callJSFunction(“myFunction”,obj);//这就是我需要的 如果(obj->批准)剂量测

假设我有一个简单的QML插件。定期检查对象的一些状态,在这个步骤中,我想从C++查询QML对象,这样:

插件代码(c++)

类MyItem:公共QQuickItem
{
公众:
MyItem(QQuickItem*父项=0):
QQuickItem(父项)
{}
void timer函数(SomeObject*obj)
{
//这里我需要调用QML函数来验证我的对象,可能是这样的:
callJSFunction(“myFunction”,obj);//这就是我需要的
如果(obj->批准)剂量测量();
}
}
QML文件:

MyItem{
id:myItem
属性bool someProperty
函数myFunction(obj)
{
obj.approved=某个属性;
}
}
我不能使用信号,因为对JS的调用必须是同步的。我的意思是我需要的是:

  • C++中的代码计时器调用函数TimeRealStices(),用对象来验证
  • 在timerFunction()中,我调用JS函数并返回结果
  • 之后,我继续执行timerFunction()
<我的问题——有没有办法从C++插件对象调用js函数? 我不能使用信号,因为对JS的调用必须是同步的

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

当然,你可以反过来做,从C++调用JS函数。我会反对这一点,因为它打破了分层——QML层应该访问C++层,而不是相反。
不管怎样,从C++调用JS函数,使用。有关详细信息,请参阅有关的文档。

谢谢@tmcguire!我一直认为信号是异步的。如果我错了,那么我的问题就解决了。