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。  在信號被髮送時決定使用哪一種關聯類型。io

Qt::DirectConnection  直接關聯   發射完信號後當即調用槽,只有當槽執行完後,發射信號處後面的代碼才能繼續執行。編譯

Qt::QueuedConnection  隊列關聯  當控制返回接受者所在的線程才執行槽函數,並且不管槽執行與否,發射信號處後面的代碼都會當即執行。cli

Qt::BlockingQueuedConnection  阻塞隊列關聯  相似於隊列關聯,信號線程會一直阻塞,直到槽返回。可是當接受者和發送者在同一個線程時,不能使用,不然會致使死鎖。

Qt::UniqueConnection  惟一關聯  使用它後,兩個對象間的相同信號和槽只能有惟一的關聯。一般和其餘鏈接類型作按位或操做。

 

信號和槽還有一種自動關聯方式:

由字符串on、部件的objectName和信號名稱三部分組成,中間用下劃線隔開的槽函數名稱能夠被QT直接關聯,不用再使用conncect函數。

如on_pushButton_clicked。  不過若是這樣使用,還須要進行其餘的設置:使用conncectSlotsByName()函數來支持信號和槽函數自動關聯。

但不建議使用這種方式,信號和槽的關聯狀況不明瞭,對其餘開發人員不友好。

相關文章
相關標籤/搜索