怎樣使用信號與槽?

怎樣使用信號與槽?

概覽

還記得 X-Window 上老舊的回調函數系統嗎?通常它不是類型安全的並且很複雜。(使用)它(會)有很多的問題。Qt提供了一種新的事件處理系統-信號-槽。想象一下鬧鐘(工作的樣子)。當鬧鈴響的時候,它正在發出信號(發射)。而你處理這個事件的過程就類似使用一個槽的樣子。

  • 每個QObject類(或其派生類)的對象都可以含有你能想象到的一樣多的信號和槽
  • 只有定義過這個信號的類或者其派生類能夠發射這個信號
  • 可以把一個槽與另一個槽連接起來(做成信號鏈)
  • 每個信號與槽之間可以有無限制數量的連接
  • 注意: 不能爲槽的參數設置缺省值。例如以下代碼是錯誤的:
    1. void mySlot(int i=0);

信號與槽的連接

可以使用下面的模板(原型)連接信號和槽:

  1. QObject::connect(const QObject * sender,constchar *signal,constQObject* receiver,constchar * method);

必須把上式中的const char * signal和const char * method分別放進SIGNALSLOT 這兩個宏裏面。

可以像下面那樣解除信號和槽的連接:

  1. QObject::disconnect(const QObject * sender,constchar *signal,constQObject* receiver,constchar * method);

進一步探討

當事件發生時,某個部件(或對象)就會發射信號。比如,當一個按鈕部件被點擊時,它就會發出“被點擊“這個信號。開發者可以選擇創建一個函數(沒錯,它就是一個“槽”),並使用connect()來把這個信號與槽關聯起來。Qt的信號與槽機制(被設計成)並不要求這些相關的類互相瞭解,這就使得開發高度可重用的類變得更容易。由於信號與槽是類型安全的,類型錯誤會以警告的方式(被編譯器)報告出來並且不會引起(程序)崩潰。

舉例來說,假如一個Quit按鈕的clicked()信號與應用程序的quit()槽相連接,那麼當用戶點擊該Quit按鈕時,就會終止這個程序的運行。用代碼實現該連接如下:

  1. connect(button, SIGNAL(clicked()), qApp, SLOT(quit()));

在應用程序運行期間的任何時候,信號與槽的連接都可以被添加或移除。它們可以在信號被立即或者安排到以後去發射時建立起來,而且可以用於不同對象間的多線程應用中。

信號與槽機制是使用標準C++實現的。它使用了C++中的預處理器以及Qt中的moc, 即元對象編譯器( Meta-Object Compiler)。代碼的生成由Qt的構建系統(Qt’s-Build-System)自動完成。開發者幾乎不需要瀏覽或者編輯這些代碼。

除了完成信號與槽的處理,元對象編譯器還對Qt的多語言機制、屬性系統以及擴展的運行時類型識別提供了支持。它還爲C++程序的運行時內省在所有支持的平臺上的運行提供了一種途徑。


參見

Qt中的信號與槽詳解


原文鏈接:怎樣使用信號與槽?



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章