1. 程式人生 > >Qt 信號槽

Qt 信號槽

信號線 繼續 關於 發送 劃線 signal 隱式 代碼 char*

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 信號槽