【QT】跨線程的信號槽(connect函數)


線程的信號槽機制需要開啟線程的事件循環機制,即調用QThread::exec()函數開啟線程的事件循環。

Qt信號-槽連接函數原型如下:

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection ) 

Qt支持5種連接方式

  • Qt::DirectConnection(直連方式)(信號與槽函數關系類似於函數調用,同步執行)
    當信號發出后,相應的槽函數將立即被調用。emit語句后的代碼將在所有槽函數執行完畢后被執行。當信號發射時,槽函數將直接被調用。無論槽函數所屬對象在哪個線程,槽函數都在發射信號的線程內執行。
  • Qt::QueuedConnection(隊列方式)(此時信號被塞到事件隊列里,信號與槽函數關系類似於消息通信,異步執行)
    當信號發出后,排隊到信號隊列中,需等到接收對象所屬線程的事件循環取得控制權時才取得該信號,調用相應的槽函數。emit語句后的代碼將在發出信號后立即被執行,無需等待槽函數執行完畢。當控制權回到接收者所依附線程的事件循環時,槽函數被調用。槽函數在接收者所依附線程執行。
  • Qt::AutoConnection(自動方式) 
    Qt的默認連接方式,如果信號的發出和接收信號的對象同屬一個線程,那個工作方式與直連方式相同;否則工作方式與隊列方式相同。如果信號在接收者所依附的線程內發射,則等同於直接連接如果發射信號的線程和接受者所依附的線程不同,則等同於隊列連接
  • Qt::BlockingQueuedConnection(信號和槽必須在不同的線程中,否則就產生死鎖) 
    槽函數的調用情形和Queued Connection相同,不同的是當前的線程會阻塞住,直到槽函數返回。
  • Qt::UniqueConnection
    與默認工作方式相同,只是不能重復連接相同的信號和槽,因為如果重復連接就會導致一個信號發出,對應槽函數就會執行多次。

如果沒有特殊的要求我們connect函數選擇默認的連接方式就好,也就是connect的第五個參數不填寫就ok,例如:

connect(m_obj, &QObject::destroyed, this, &MainWindow::SetPtrNullptr);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM