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种情况:
- 在我的 main.cpp 中(我创建 QML 引擎的地方),我以这种方式将 QML 中的 signal() 连接到 c++ 中的 doSomething()
QObject::connect("QObject* cast of my QML engine", SIGNAL(signal()), "CppClass* object name", SLOT(doSomething()));
- 在我的 QML 代码中,我在按钮 qml 类型的 onClicked() 槽中写了这个:
qmlCppClass.doSomething()
- 我在 QML 中使用连接类型是这样的:
Connections {
target: qmlRoot
function onSignal() {
qmlCppClass.doSomething()
}
}
在每种情况下,插槽是在 qml 线程(a.k.a. 主线程)中执行还是在包含 CppClass
对象实例(a.k.a 的线程中执行。目标线程)?
如果 connect
与 QueuedConnection
一起完成,则插槽将在接收方的线程上执行,否则 - 在发送方的线程上执行。假设您在 建立连接之前 将接收器移动到另一个线程,默认情况下它将是一个排队的连接。
如果没有直接调用 connect
函数,则可能会使用 invokeMethod
,其行为与上述相同。
如果直接调用成员函数,那么它会在调用它的线程中执行。
假设我们有一个名为 CppClass
的基于 QObject 的 c++ class,它以名称 qmlCppClass
在 QML 上下文中注册并移动到一个新线程 使用 QObject::moveToThread("newThread* name")
.
假设 CppClass
有一个 public 插槽 声明为 void doSomething()
.
假设根 QML object/window 中定义了一个 signal 称为 signal()
.
现在假设3种情况:
- 在我的 main.cpp 中(我创建 QML 引擎的地方),我以这种方式将 QML 中的 signal() 连接到 c++ 中的 doSomething()
QObject::connect("QObject* cast of my QML engine", SIGNAL(signal()), "CppClass* object name", SLOT(doSomething()));
- 在我的 QML 代码中,我在按钮 qml 类型的 onClicked() 槽中写了这个:
qmlCppClass.doSomething()
- 我在 QML 中使用连接类型是这样的:
Connections {
target: qmlRoot
function onSignal() {
qmlCppClass.doSomething()
}
}
在每种情况下,插槽是在 qml 线程(a.k.a. 主线程)中执行还是在包含 CppClass
对象实例(a.k.a 的线程中执行。目标线程)?
如果 connect
与 QueuedConnection
一起完成,则插槽将在接收方的线程上执行,否则 - 在发送方的线程上执行。假设您在 建立连接之前 将接收器移动到另一个线程,默认情况下它将是一个排队的连接。
如果没有直接调用 connect
函数,则可能会使用 invokeMethod
,其行为与上述相同。
如果直接调用成员函数,那么它会在调用它的线程中执行。