【发布时间】:2015-02-03 11:37:55
【问题描述】:
我知道通常你不会按照我的要求去做。我知道这两层应该是分开的,通过信号/槽机制连接,如果我们处理线程,这可能是异步的。
明白这一点,我仍然需要从 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
}
}
我不知道如何通过QMetaObject::invokeMethod同步调用onCallQmlHandler。
我没有从代码创建 qml 对象,此时在 cpp 中我无法访问 qml 组件来查找它的子组件,在那里按名称找到 MyObject 并调用它的处理程序(如果可能的话)。无论如何,这不是一个漂亮的方法。
我试图在 QMetaObject 方法中找到信号处理程序,但它不存在。它也不在属性列表中(我检查以防万一,因为信号处理程序的语法类似于属性的语法)
有谁知道我是否错过了通过QMetaObject::invokeMethod 调用信号处理程序的正确语法,或者根本不可能?有什么想法吗?
【问题讨论】:
-
你检查Connections类型了吗?如前所述,它“可以接收来自其指定目标的任何信号。”
-
如果
invokeMethod(this, "myNiceQmlFunction", ...);是一个C++语句,而this是一个C++对象,那么myNiceQmlFunction怎么能在QML上呢? -
@Smasho
this
的类型是使用“qmlRegisterType”为 qml 注册的,所以它可以非常简单。我只是在“Type”对象内的 qml“function myNiceQmlFunction() {}”中声明。 -
@BaCaRoZzo 你能澄清一下吗?我不明白 qml
Connections类型如何帮助我从 c++ 调用处理程序。 -
在您的场景中有一个 c++ 信号并且处理程序在 QML 中。这就是我看到的代码。正如@Smasho 的回答所解释的那样,这是
Connections解决的一个用例。顺便说一句,跨线程的信号槽总是QueuedConnectioned。
标签: c++ qt qml signals-slots