線程的信號槽機制需要開啟線程的事件循環機制,即調用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);