Qt 信號槽
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。 在信號被發送時決定使用哪種關聯類型。
Qt::DirectConnection 直接關聯 發射完信號後立即調用槽,只有當槽執行完後,發射信號處後面的代碼才能繼續執行。
Qt::QueuedConnection 隊列關聯 當控制返回接受者所在的線程才執行槽函數,而且無論槽執行與否,發射信號處後面的代碼都會立即執行。
Qt::BlockingQueuedConnection 阻塞隊列關聯 類似於隊列關聯,信號線程會一直阻塞,直到槽返回。但是當接受者和發送者在同一個線程時,不能使用,否則會導致死鎖。
Qt::UniqueConnection 唯一關聯 使用它後,兩個對象間的相同信號和槽只能有唯一的關聯。通常和其他連接類型做按位或操作。
信號和槽還有一種自動關聯方式:
由字符串on、部件的objectName和信號名稱三部分組成,中間用下劃線隔開的槽函數名稱可以被QT直接關聯,不用再使用conncect函數。
如on_pushButton_clicked。 不過如果這樣使用,還需要進行其他的設置:使用conncectSlotsByName()函數來支持信號和槽函數自動關聯。
但不建議使用這種方式,信號和槽的關聯情況不明了,對其他開發人員不友好。
Qt 信號槽