如何从另一个线程的cpp代码同步调用qml信号处理程序?

时间:2015-02-03 11:37:55

标签: c++ qt qml signals-slots

我知道通常你不会做我要问的事。我知道这两个层应该是分开的,并通过信号/插槽机制连接,如果我们处理线程,这可能是异步的。

理解这一点,我仍然需要从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调用信号处理程序的正确语法,或者根本不可能?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用其上下文将C ++对象传递给QML。

qmlviewer.rootContext()->setContextProperty("backend", backend);

QML方面:

Connections {
    target: backend
    onCallQmlHandler: {
        // do something right now
    }
}

从后端对象发出callQmlHandler时,会执行处理程序。 但Connections对象可能会创建排队连接,因此您可以实现自己的DirectConnections。在this帖子结束时,您有一个实现。

然而,QML被QML引擎所超越,我认为它是由一个线程运行的,所以除非你真的知道自己在做什么,否则你可能会遇到更大的问题!