Qt 中信號與槽(signal-slot)機制支持 多種連接方式(ConnectionType)
Qt 中信號與槽(signal-slot)機制支持 多種連接方式(ConnectionType),用于控制信號發出后如何調用槽函數,特別是在 跨線程 情況下。Qt 提供了以下幾種連接方式(定義在 Qt::ConnectionType 枚舉中):
🔹 1. Qt::AutoConnection(默認方式)
行為:根據信號發出者(sender)和接收者(receiver)是否在同一線程自動選擇連接方式:
如果在 同一線程:等價于 Qt::DirectConnection(同步調用);
如果在 不同線程:等價于 Qt::QueuedConnection(異步調用)。
推薦使用場景:大多數場景下使用即可,尤其是在你不關心同步還是異步的具體方式時。
🔹 2. Qt::DirectConnection
行為:立即在發出信號的線程中 同步調用槽函數。
注意:如果 sender 和 receiver 不在同一線程,且槽函數操作 UI,會導致 線程不安全。
使用場景:適用于確定 sender 和 receiver 在同一線程,且你需要立即執行槽邏輯。
🔹 3. Qt::QueuedConnection
行為:異步調用,即信號發出時不會立即執行槽函數,而是將槽函數調用封裝成事件,放入接收者線程的事件隊列中。
使用場景:適用于 sender 和 receiver 不在同一線程,且希望異步處理。
🔹 4. Qt::BlockingQueuedConnection
行為:異步 + 阻塞式。槽函數在接收者線程中執行,但 發出信號的線程會阻塞,直到槽函數執行完畢。
前提:
sender 和 receiver 必須在不同線程;
否則會產生死鎖。
使用場景:跨線程時需要等待槽函數執行完成(例如同步 RPC 調用)。
🔹 5. Qt::UniqueConnection
行為:不是獨立的調用方式,而是一個 標志位,可與其他連接類型組合使用(例如 Qt::QueuedConnection | Qt::UniqueConnection)。
作用:防止重復連接,若該連接已存在,不再重復連接。
使用場景:防止槽函數被多次重復調用(通常在某些循環連接邏輯中非常有用)。
🔹 6. Qt::SingleShotConnection(Qt 6.0+)
行為:連接一次信號后,只觸發一次槽函數調用。調用后自動斷開連接。
使用場景:只希望在信號首次觸發時響應一次,例如臨時任務或一次性資源初始化。
組合用法:可以與其他連接類型一起使用,例如 Qt::SingleShotConnection | Qt::QueuedConnection。