我知道通常你不会做我要问的事。我知道这两个层应该是分开的,并通过信号/插槽机制连接,如果我们处理线程,这可能是异步的。
理解这一点,我仍然需要从SG线程同步调用qml信号处理程序。 Qml对象存在于GUI线程中,因此从SG线程(特别是来自updatePaintNode()
方法)发出信号会导致异步事件。
我已经阅读了文档,我可以从另一个线程的cpp同步调用qml函数。例如:
QMetaObject::invokeMethod(this, "myNiceQmlFunction", Qt::DirectConnection);
但想象一下:
//some.cpp
signal void callQmlHandler();
//some.qml
MyObject {
onCallQmlHandler: {
// do something right now
}
}
我不知道如何通过onCallQmlHandler
同步拨打QMetaObject::invokeMethod
。
我没有从代码创建qml对象,此时在cpp中我无法访问qml组件来查找其子代,通过名称查找MyObject
并调用其处理程序(如果可能)。无论如何,这不是一个很好的方式。
我试图在QMetaObject方法中找到信号处理程序,但它并不存在。它也不在属性列表中(我检查以防万一,因为信号处理程序的语法类似于属性的一个)
有没有人知道我是否错过了通过QMetaObject::invokeMethod
调用信号处理程序的正确语法,或者根本不可能?有什么想法吗?
答案 0 :(得分:1)
您可以使用其上下文将C ++对象传递给QML。
qmlviewer.rootContext()->setContextProperty("backend", backend);
QML方面:
Connections {
target: backend
onCallQmlHandler: {
// do something right now
}
}
从后端对象发出callQmlHandler
时,会执行处理程序。
但Connections
对象可能会创建排队连接,因此您可以实现自己的DirectConnections
。在this帖子结束时,您有一个实现。
然而,QML被QML引擎所超越,我认为它是由一个线程运行的,所以除非你真的知道自己在做什么,否则你可能会遇到更大的问题!