QML 对 C++ public 槽的调用是在 C++ 目标线程中执行的,还是在 QML(主线程)中执行的?

Are QML calls to C++ public slots executed in the c++ target thread, or in QML (main thread)?

假设我们有一个名为 CppClass 的基于 QObject 的 c++ class,它以名称 qmlCppClass 在 QML 上下文中注册并移动到一个新线程 使用 QObject::moveToThread("newThread* name").

假设 CppClass 有一个 public 插槽 声明为 void doSomething().

假设根 QML object/window 中定义了一个 signal 称为 signal().

现在假设3种情况:

  1. 在我的 main.cpp 中(我创建 QML 引擎的地方),我以这种方式将 QML 中的 signal() 连接到 c++ 中的 doSomething()
    QObject::connect("QObject* cast of my QML engine", SIGNAL(signal()), "CppClass* object name", SLOT(doSomething()));
  1. 在我的 QML 代码中,我在按钮 qml 类型的 onClicked() 槽中写了这个:
    qmlCppClass.doSomething()
  1. 我在 QML 中使用连接类型是这样的:
    Connections {
        target: qmlRoot
        function onSignal() {
            qmlCppClass.doSomething()
        }
    }

在每种情况下,插槽是在 qml 线程(a.k.a. 主线程)中执行还是在包含 CppClass 对象实例(a.k.a 的线程中执行。目标线程)?

如果 connectQueuedConnection 一起完成,则插槽将在接收方的线程上执行,否则 - 在发送方的线程上执行。假设您在 建立连接之前 将接收器移动到另一个线程,默认情况下它将是一个排队的连接。

如果没有直接调用 connect 函数,则可能会使用 invokeMethod,其行为与上述相同。

如果直接调用成员函数,那么它会在调用它的线程中执行。