1. 程式人生 > >Qt 教程-訊號和曹(02)

Qt 教程-訊號和曹(02)

訊號和曹
訊號和曹被用於Qt物件之間的通訊。這個訊號和曹機制
是Qt的中心特徵,它所提供的功能不同於其他大多數框架。


在GUI程式設計中,當我們改變一個元件時,我們經常想讓另一個元件被通知。在大多數情況下,我們想讓任何一種物件能夠跟其他物件進行通訊。舉個例子,如果使用者點選了Close按鈕,我們想讓窗體的close()函式被呼叫。老的工具箱利用回撥來實現這種通訊。一個回撥就是一個指向一個函式的指標,所以如果你想一個處理函式來通知你有事情發生了,你需要將一個指向另一個函式的指標傳遞給處理函式。


處理函式然後在適當的時間呼叫回撥函式。回撥有兩個基本缺點:第一,他們型別不安全。我們不能確定處理函式使用正確的引數呼叫回撥。第二,當處理函式必須知道呼叫哪個回撥的時候,回撥與處理函式耦合。


在Qt中,我們對回撥有了可替換的技術:我們使用訊號和曹。當特定的事件發生的時候,一個訊號就會發射。Qt的元件有很多預定義的訊號,但是我們總是繼將我們自己的訊號增加到子類元件。一個曹被呼叫相應這個訊號。Qt的元件也有許多預定義的曹,但是我們經常在子類元件增加我們自己的曹來處理你想處理的訊號。
訊號和曹機制是型別安全的:訊號標記必須匹配將要接受的曹的標記。(事實上,一個曹的標記比他接收到的訊號的標記要短,因為他可以忽略額外的引數)。
當相容標記後,編譯器能夠幫助我們檢測型別失配率。訊號和曹是鬆耦合的:發射訊號的類既不認識,也不關心哪個曹來接受這個訊號。Qt的訊號和曹機制確保了當你將一個訊號和曹連線之後,曹將會在適當的時機使用訊號的引數被呼叫。訊號和曹能夠接受任意型別任意引數。因為他們完全型別安全。


所有繼承QObject的類或者這個子類能夠包含訊號和曹。當他們以某種對其他物件感興趣的方式改變他們的狀態的時候,訊號將會被物件發射。所有物件通過這種方式進行通訊。他們既不認識也不關心接受關心發射的訊號。這是一個好的封裝,來確保物件作為軟體元件來使用。


曹可以被用來接收訊號,但是他們也是常規成員函式。一個物件是不會知道什麼東西接受了他的訊號的,一個曹也不會知道將連線什麼訊號。這確保了獨立元件能夠使用Qt建立。正如你想單一的曹儘儘可能的連線很多訊號一樣,一個訊號也可以根據你的需要連線多個曹。直接將一個訊號與另外一個訊號連線起來也是可以的。(一旦第一個訊號被髮射,第二個辛哈也會立即被髮射)。