使用QT開發時,我們一般要使用到信号槽機制,這個機制由三部分組成:信号、槽、連接函數connect,我們主要 說下connect函數,了解清楚此函數,信号槽機制也基本上懂了。
快樂學習
我們一般情況下我們使用connect函數隻傳遞四個參數:
connect(Sender,SIGNAL(signal),Receiver,SLOT(slot));
這四個參數分别是發送者對象、發送者對象發送的信号、接收者對象、接收者對象響應該信号的槽函數,所以我們有可能認為該函數就隻有四個參數,但實際上是有第五個參數的,隻是通常該函數已經給第五個參數賦值了而已,我們所使用的是默認值。實際上connect函數應該是如下形式:
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )
Qt::DirectConnection參數 參數含義
Qt::AutoConnection 默認值,使用這個值則連接類型會在信号發送時決定。如果接收者和發送者在同一個線程,則自動使用Qt::DirectConnection類型。如果接收者和發送者不在一個線程,則自動使用Qt::QueuedConnection類型。
Qt::DirectConnection 槽函數會在信号發送的時候直接被調用,槽函數運行于信号發送者所在線程。效果看上去就像是直接在信号發送位置調用了槽函數。這個在多線程環境下比較危險,可能會造成奔潰。
Qt::QueuedConnection 槽函數在控制回到接收者所在線程的事件循環時被調用,槽函數運行于信号接收者所在線程。發送信号之後,槽函數不會立刻被調用,等到接收者的當前函數執行完,進入事件循環之後,槽函數才會被調用。多線程環境下一般用這個。
Qt::BlockingQueuedConnection 槽函數的調用時機與Qt::QueuedConnection一緻,不過發送完信号後發送者所在線程會阻塞,直到槽函數運行完。接收者和發送者絕對不能在一個線程,否則程序會死鎖。在多線程間需要同步的場合可能需要這個。
Qt::UniqueConnection 這個flag可以通過按位或(|)與以上四個結合在一起使用。當這個flag設置時,當某個信号和槽已經連接時,再進行重複的連接就會失敗。也就是避免了重複連接。
sender和receiver是QObject對象指針,函數裡面我們用到了Qt提供的兩個宏SIGNAL()和SLOT();這是Qt要求的,要關聯信号和槽必須借助于這兩個宏,兩個宏的定義如下:
#define SLOT(name) "1"#name
#define SIGNAL(name) "2"#name
通過這兩個宏,就可以把我們傳遞進去的槽和信号的名字轉化成字符串,并在這兩個字符串前面加上附加的字符。Qt5又在此基礎上擴展了一種寫法不必用到兩個宏SIGNAL()和SLOT(),而是直接寫&類名::信号或者&類名::槽函數。一個信号可以和多個槽相連;也可以多個信号可以連接一個槽;也有一個信号可以連接到另一個信号;一個對象delete之後,Qt自動取消所有連接到這個對象上面的槽,有時候我們需要手動去斷開連接,如下情況:
有時我們程序中某些情況下某個操作需要斷開這個信号槽連接,操作結束後有需要重新連接,斷開連接時,那我們需要調用函數
bool QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method )
用法和connect大緻相同。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!