gpt4 book ai didi

c++ - 跨线程从 QML 调用 QObject 函数

转载 作者:可可西里 更新时间:2023-11-01 18:00:12 26 4
gpt4 key购买 nike

我正在尝试确定如何从 QML 调用 QObject 槽或 Q_INVOKABLE 方法来为存在于另一个线程中的 QObject 工作,以及这样做是否安全。

假设有一个 MainThread 和 ThreadA。 QObjectA 存在于 ThreadA 中。 QML 引擎/GUI/一切都在 MainThread 中。我使用

将 QObjectA 暴露给 QML 引擎
declarativeView->setContextProperty("someObj",ObjectA)

现在在 QML 文件中,我调用

someObj.someMethod();

其中 someMethod 是一个插槽或者是 Q_INVOKABLE。我想知道哪个线程实际执行该函数。如果它是 MainThread,那将是一件坏事,并且跨线程调用这样的方法将是危险的。但是,如果它由 ThreadA 执行,一切都会好起来的。

基于此文档:http://doc.qt.nokia.com/4.7-snapshot/qtbinding.html ,我假设 QMetaObject::invokeMethod() 用于调用 QObject 函数。该文档 ( http://doc.qt.nokia.com/4.7-snapshot/qmetaobject.html#invokeMethod ) 表明有不同的连接类型可用,就像 Qt 信号和槽一样。

我想知道当跨线程从 QML 调用 C++ 方法时,Qt 的 qml 引擎是否会自动选择正确的类型,如果是这样,从 QML 调用其他线程中的对象的方法是一种可接受的做法。

最佳答案

因为它became apparent前段时间QML好像不能跨线程。

因此需要实现一个位于主线程中的 C++ 端中间对象,以将调用分派(dispatch)给其他线程中的对象。

QML object -> object in a different thread // doesn't work!!!
QML object -> C++ mediator object -> object in a different thread // WORKS!!!

基本上,“超越”线程必须完全在 C++ 中发生,因此需要中介对象。

关于c++ - 跨线程从 QML 调用 QObject 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12031020/

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