gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:39 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

QML 方面:

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

当您从后端对象发出 callQmlHandler 时,您会执行处理程序。但是 Connections 对象可能会创建排队连接,因此您可以实现自己的 DirectConnectionsthis结尾发布你有一个实现。

但是 QML 是由 QML 引擎执行的,我认为它旨在由单个线程运行,所以除非您真的知道自己在做什么,否则您可能会遇到更大的问题!

关于c++ - 如何从另一个线程的 cpp 代码同步调用 qml 信号处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28297954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com