怎樣使用信號與槽?
概覽
還記得 X-Window 上老舊的回調函數系統嗎?通常它不是類型安全的並且很複雜。(使用)它(會)有很多的問題。Qt提供了一種新的事件處理系統-信號-槽。想象一下鬧鐘(工作的樣子)。當鬧鈴響的時候,它正在發出信號(發射)。而你處理這個事件的過程就類似使用一個槽的樣子。
- 每個QObject類(或其派生類)的對象都可以含有你能想象到的一樣多的信號和槽
- 只有定義過這個信號的類或者其派生類能夠發射這個信號
- 可以把一個槽與另一個槽連接起來(做成信號鏈)
- 每個信號與槽之間可以有無限制數量的連接
- 注意: 不能爲槽的參數設置缺省值。例如以下代碼是錯誤的:
-
void mySlot(int i=0);
-
信號與槽的連接
可以使用下面的模板(原型)連接信號和槽:
必須把上式中的const char * signal和const char * method分別放進SIGNAL 和SLOT 這兩個宏裏面。
可以像下面那樣解除信號和槽的連接:
進一步探討
當事件發生時,某個部件(或對象)就會發射信號。比如,當一個按鈕部件被點擊時,它就會發出“被點擊“這個信號。開發者可以選擇創建一個函數(沒錯,它就是一個“槽”),並使用connect()
來把這個信號與槽關聯起來。Qt的信號與槽機制(被設計成)並不要求這些相關的類互相瞭解,這就使得開發高度可重用的類變得更容易。由於信號與槽是類型安全的,類型錯誤會以警告的方式(被編譯器)報告出來並且不會引起(程序)崩潰。
舉例來說,假如一個Quit按鈕的clicked()
信號與應用程序的quit()
槽相連接,那麼當用戶點擊該Quit按鈕時,就會終止這個程序的運行。用代碼實現該連接如下:
-
connect(button, SIGNAL(clicked()), qApp, SLOT(quit()));
在應用程序運行期間的任何時候,信號與槽的連接都可以被添加或移除。它們可以在信號被立即或者安排到以後去發射時建立起來,而且可以用於不同對象間的多線程應用中。
信號與槽機制是使用標準C++實現的。它使用了C++中的預處理器以及Qt中的moc
, 即元對象編譯器( Meta-Object Compiler)。代碼的生成由Qt的構建系統(Qt’s-Build-System)自動完成。開發者幾乎不需要瀏覽或者編輯這些代碼。
除了完成信號與槽的處理,元對象編譯器還對Qt的多語言機制、屬性系統以及擴展的運行時類型識別提供了支持。它還爲C++程序的運行時內省在所有支持的平臺上的運行提供了一種途徑。
參見
原文鏈接:怎樣使用信號與槽?