Qt4與Qt5的信號槽有些不一樣:函數
1. Qt4的槽函數必須使用slots關鍵字聲明,而Qt5中已經再也不須要了,槽函數能夠是任何能和信號關聯的成員函數。線程
2. Qt4指定信號函數和槽函數需用SIGNAL和SLOT宏,它們的功能是將參數轉換爲const char*類型。而Qt5中傳遞的是信號函數和槽函數的指針。指針
3. Qt5支持編譯時進行檢查,信號或槽的拼寫錯誤、槽函數參數多餘信號函數等錯誤能夠在編譯時就檢查出來,而Qt4不行。並且參數類型不須要一致,只要能隱式轉換就行。對象
4. Qt5還支持C++11的lambda表達式,能夠在關聯時直接編寫信號發射後要執行的代碼,再也不須要聲明定義槽函數了。隊列
關於connect函數的第五個參數:開發
有五種類型:字符串
Qt::AutoConnection 自動關聯 (默認) 若是接受者和發送者在同一個線程,則使用Qt::DirectConnection ,不然使用Qt::QueuedConnection。 在信號被髮送時決定使用哪一種關聯類型。io
Qt::DirectConnection 直接關聯 發射完信號後當即調用槽,只有當槽執行完後,發射信號處後面的代碼才能繼續執行。編譯
Qt::QueuedConnection 隊列關聯 當控制返回接受者所在的線程才執行槽函數,並且不管槽執行與否,發射信號處後面的代碼都會當即執行。cli
Qt::BlockingQueuedConnection 阻塞隊列關聯 相似於隊列關聯,信號線程會一直阻塞,直到槽返回。可是當接受者和發送者在同一個線程時,不能使用,不然會致使死鎖。
Qt::UniqueConnection 惟一關聯 使用它後,兩個對象間的相同信號和槽只能有惟一的關聯。一般和其餘鏈接類型作按位或操做。
信號和槽還有一種自動關聯方式:
由字符串on、部件的objectName和信號名稱三部分組成,中間用下劃線隔開的槽函數名稱能夠被QT直接關聯,不用再使用conncect函數。
如on_pushButton_clicked。 不過若是這樣使用,還須要進行其餘的設置:使用conncectSlotsByName()函數來支持信號和槽函數自動關聯。
但不建議使用這種方式,信號和槽的關聯狀況不明瞭,對其餘開發人員不友好。