qt学习之路3 ---信号与槽机制
?信號和槽機制
1.概述
Qt采用了一種全新的對象和方法的關聯與通信機制,稱為信號和槽機制。信號和槽機制是獨立于標準C++編譯器的,在編譯之前需要經過Qt的專門預處理工具MOC(Meta Object Compiler,元組件編譯器)對代碼進行預處理后才能進一步進行C++代碼的編譯。MOC會將Qt應用程序中特有的代碼自動轉化為相應的標準C++語法代碼。
信號和槽的概念是Qt編程中最具代表性的特點之一。GUI編程中通常使用回調函數進行事件處理,而回調函數通常是一個函數指針,不同的事件、不同的對象都有著各自的回調函數。當事件到來時,系統會通過調用對應的回調函數來完成相應的處理。
Qt引入了信號和槽機制來取代回調函數。凡是繼承自QObject的類都可以具有信號和槽成員,并可以使用它們。信號和槽的使用可以有效地減少函數指針的使用,使程序代碼清晰簡潔,對于事件響應管理更加容易。此外,信號和槽沒有嚴格規定函數的類型,因此在調用過程中是安全的。
信號和槽的使用可以實現信息封裝,增加程序的靈活性。信號和槽都采用函數作為存在形式。在Qt程序初始化或運行的過程中,可以靜態或動態地將信號和槽相關聯。當某一事件到來時,會發射信號,但是發射后,它并不需要關心信號的處理者是誰。當觸發槽函數時,說明與其關聯的信號被接收,但它不需要了解誰發出了信號,它只需要負責進行相應的處理即可。
2.信號
信號是Qt中對事件的一種抽象,當一個事件到來時,會發射信號。所謂的發射信號,就是通過Qt中特有的通信機制,調用和信號相關的各個槽函數。因此當發射信號時,將執行與其相關聯的槽函數。信號采用函數的形式,因此,當所有與信號關聯的函數全部返回后,信號函數才會返回。信號函數在形式上與標準C++中的虛函數類似,信號函數只有頭文件中函數的聲明,而沒有函數的定義(即函數體)。信號的聲明形式如下:
對于信號的聲明與普通的C++函數無異,它不限制參數的個數與類型,同時它還支持重載。不過信號的返回值只要求必須為void型,因為事件是一種中斷,對于突發性的中斷,不可能期望其有返回值。
3.槽
槽是Qt中負責信號處理的實體,當有信號發射時,與信號關聯的所有槽會依次執行。槽也采用函數的形式,不過槽需要有實際的函數定義,相當于在標準C++中對虛函數的多態實現。槽函數的聲明形式如下:
?
?
與信號相同,槽函數的定義同普通的C++函數無異,支持C++函數的一些特性。同時,槽函數可以采用標準C++函數的使用方式,在代碼中直接調用。槽函數具有訪問權限的標識,它們同C++類的成員函數的標識相同,分別為:public、protected、private。public說明該槽函數可以被其他類的信號所關聯,protected說明只能被類本身和其子類的信號所關聯,private說明該槽函數只能被類本身的信號所關聯。
在Qt的基類QObject中有一個成員函數用來完成信號和槽的映射,函數的原型如下:
const?char?*signal,?const?QObject?*receiver,?const?char?*member);?
?
其中,sender和receiver分別指定了被關聯的信號和槽的發送者和接收者。signal是信號,Qt要求必須使用宏SINGAL將信號函數指針轉化為指定的類型。member是槽,Qt要求必須使用宏SLOT轉化函數指針。宏SINGAL和SLOT的參數形式如下:
?
其中,funname是函數名,param_type_x是函數中對應參數的類型。
轉載于:https://blog.51cto.com/5815084/971673
總結
以上是生活随笔為你收集整理的qt学习之路3 ---信号与槽机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AutoEncoder、RBM、DBM、
- 下一篇: Oracle 11g Release 1