信號和槽是一種高級接口,應用於對象之間的通訊,它是 QT 的核心特性,也是 QT 區別於其它工具包的重要地方。它爲高層次的事件處理自動生成所須要的附加代碼。在咱們所熟知的不少 GUI 工具包中,窗口小部件 (widget) 都有一個回調函數用於響應它們能觸發的每一個動做,這個回調函數一般是一個指向某個函數的指針。可是,在 QT 中信號和槽取代了這些凌亂的函數指針,使得咱們編寫這些通訊程序更爲簡潔明瞭。
全部從 QObject 或其子類 ( 例如 Qwidget) 派生的類都可以包含信號和槽。當對象改變其狀態時,信號就由該對象發射 (emit) 出去,這就是對象所要作的所有事情,它不知道另外一端是誰在接收這個信號。這就是真正的信息封裝,它確保對象被看成一個真正的軟件組件來使用。槽用於接收信號,但它們是普通的對象成員函數。一個槽並不知道是否有任何信號與本身相鏈接。並且,對象並不瞭解具體的通訊機制。
你能夠將不少信號與單個的槽進行鏈接,也能夠將單個的信號與不少的槽進行鏈接,甚至於將一個信號與另一個信號相鏈接也是可能的,這時不管第一個信號何時發射系統都將馬上發射第二個信號。總之,信號與槽構造了一個強大的部件編程機制。
說實話對於像我這樣的新手來講看着就蛋疼,想學會它沒辦法,咱們仍是簡化一下概念吧:
全部QObject類均可以使用信號槽,換句話來講繼承自pyqt中的類基本上均可以使用信號槽機制。固然非QObject也是能夠經過其餘一些辦法來使用信號槽的。
僅僅有了信號和槽是不行的,咱們還須要瞭解:
信號(Signal)、槽(slot)、鏈接(connect)、動做事件(action)、發射(emit)、發送者、接受者等等一些列的知識。好吧,別搞的那麼複雜行不行,咱們仍是學學該怎麼用吧。
python
在Qt Designer中爲咱們提供了一些基本的信號槽方法,咱們來看看:編程
點擊工具欄上的「編輯信號/槽」,進入信號槽編輯模式,咱們能夠直接在發送者(button)上按住鼠標左鍵不放,拖動到接收者(Form窗體)上。這樣就創建起了鏈接。
app
接着,會彈出配置鏈接對話框。函數
左邊是發送者(按鈕)的信號(動做事件),右邊是接收者(窗體)的槽(動做事件)工具
如圖所示,我信號選擇的是clicked,槽選擇的是closeui
咱們看一下編譯後生成的代碼:
self.quitButton.clicked.connect(Form.close)
spa
實現的功能是:當按鈕點擊以後關閉窗體。
流程:按鈕是信號發送者,當點擊按鈕以後會發送一個信號出去,經過這段代碼程序內部的通信機制知道這個按鈕的點擊事情被鏈接到窗體的關閉事件上去了,而後通知接受者窗體,你該運行槽函數close了!
.net
那麼咱們怎麼能執行本身的「槽」呢?
指針
[python] view plain copy print?code
from PyQt5 import QtWidgets
from untitled import Ui_Form
class mywindow(QtWidgets.QWidget,Ui_Form):
def __init__(self):
super(mywindow,self).__init__()
self.setupUi(self)
self.myButton.clicked.connect(self.myPrint) #槽函數不用加括號
def myPrint(self): #定義槽
print("helloWorld")
if __name__=="__main__":
import sys
app=QtWidgets.QApplication(sys.argv)
myshow=mywindow()
myshow.show()
sys.exit(app.exec_())
from PyQt5 import QtWidgets from untitled import Ui_Form class mywindow(QtWidgets.QWidget,Ui_Form): def __init__(self): super(mywindow,self).__init__() self.setupUi(self) self.myButton.clicked.connect(self.myPrint) #槽函數不用加括號 def myPrint(self): #定義槽 print("helloWorld") if __name__=="__main__": import sys app=QtWidgets.QApplication(sys.argv) myshow=mywindow() myshow.show() sys.exit(app.exec_())
槽其實就個函數(方法),Qt5中的槽函數不在限定必須是slot,能夠是普通的函數、類的普通成員函數、lambda函數等。編譯期間就會檢查信號與槽是否存在! 信號的connect鏈接最好放在__init__析構函數裏面,這樣只會聲明一次鏈接,若是在類方法(函數中)使用的話,要記得disconnect,不然connect會鏈接屢次,致使程序異常。 信號槽函數不用加 (),不然可能會致使鏈接異常。