如何从另一个线程的 cpp 代码同步调用 qml 信号处理程序
How to call qml signal handler synchronously from cpp code from another thread?
我知道通常你不会按照我的要求去做。我知道这两层应该是分开的,并通过信号/插槽机制连接,如果我们处理线程,这可能是异步的。
理解了这一点,我仍然需要从 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
对象可能会创建排队的连接,因此您可以实现自己的DirectConnections
。在这篇文章的最后,你有一个实现。
然而,QML是由QML引擎超越的,我认为它是由单个线程运行的,所以你可能会遇到一个更大的问题,除非你真的知道你在做什么!
相关文章:
- 什么时候调用组成单元对象的析构函数
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- ofstream::close() 是否在 Linux 上调用同步?
- Vulkan是否需要在多个具有透明度的平局调用之间进行同步
- 关于C++ REST SDK 和同步调用
- 异步操作的 Asio 处理程序在其同步对应项正常工作时不会调用
- 使用 P/调用传递取消标志时是否需要同步
- 从多个线程对共享对象的同步方法调用
- 嵌入在c中的Python.正在调用pyrun_simplestring同步
- 可以使对AudioObjectSetPropertyData的调用同步吗
- 如何从另一个线程的 cpp 代码同步调用 qml 信号处理程序
- C++:如何异步调用同步库调用
- 为什么std::async即使指定了std::launch::async标志,也要同步调用函数?
- 同步来自多个对象的异步调用
- 对运算符的调用是否'delete'同步的?
- 当调用ReadDirectoryChangesW时,只有第一次调用返回任何更改(同步和异步)
- c++ /Boost:跨多个方法(getter)调用同步对资源的访问
- 是boost::信号槽被同步或异步调用
- 使用异步调用与在线程中使用同步调用相同
- 如何使用 MethodInvoker 委托在 cli c++ 中同步对控件线程的调用