想象一下,我們有一個基于 QObject 的 c 類CppClass,它在 QML 背景關系中注冊,qmlCppClass 并使用QObject::moveToThread("newThread* name").
想象一下CppClass,有一個公共插槽宣告為void doSomething().
想象一下,根QML物件/視窗在其內部定義了一個名為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 型別,如下所示:
Connections {
target: qmlRoot
function onSignal() {
qmlCppClass.doSomething()
}
}
在每種情況下,槽是在 qml 執行緒(又名主執行緒)中執行還是在包含CppClass物件實體的執行緒(又名目標執行緒)中執行?
uj5u.com熱心網友回復:
如果connect完成,QueuedConnection則插槽將在接收者的執行緒上執行,否則 - 在發送者的執行緒上執行。鑒于您在建立連接之前將接收器移動到另一個執行緒,默認情況下它將是一個排隊連接。
如果沒有直接呼叫該connect函式,則invokeMethod可以使用具有與上述相同行為的函式。
如果使用直接呼叫成員函式,那么它將在呼叫它的執行緒中執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/468400.html
