python GUI庫圖形介面開發之PyQt5訊號與槽基礎使用方法與例項
訊號與槽有三種使用方法
第一種:內建訊號與槽的使用
第二種:自定義訊號與槽的使用
第三種:裝飾器的訊號與槽的使用
一: 內建訊號與槽的使用
內建訊號與槽的使用,是指在發射訊號時,使用視窗控制元件的函式,而不是自定義的函式,這種也是我們前面用的最多的,下面簡單的一個例項,大家就會明白
import sys from PyQt5.QtWidgets import QMessageBox,QPushButton,QApplication,QWidget app=QApplication(sys.argv) widget=QWidget() def showMsg(): QMessageBox.information(widget,'資訊提示框','Ok 彈出測試資訊') btn=QPushButton('測試點選按鈕',widget) btn.clicked.connect(showMsg) widget.show() sys.exit(app.exec_())
執行指令碼,顯示效果如下
這個例子將一個按鈕物件的內建clicked訊號與自定義槽函式showMsg()連線,單擊按鈕,就會觸發這個槽函式,彈出一個資訊提示框
二:自定義訊號與槽的使用
自定義訊號與槽的使用,是指在發射訊號時,不使用視窗控制元件的函式,而是使用自定義的函式,(簡單的說就是使用oyqtsSignal類例項發射訊號),之所以要使用自定義的訊號與槽,是因為通過內建函式發射訊號有自身的缺陷,首先,內建函式只包含一些常用地訊號,有些訊號發射找不到對應的內建函式,其次在特定的情況下,才能發射此訊號,如按鈕的點選事件,最後,內建函式傳遞的引數是特定的,不可以自定義,使用自定義的訊號與槽函式則沒有這些缺陷
在pyqt5中,自定義訊號與槽的適用很靈活,比如因為業務需要,在程式中的某些地方需要發射一個訊號,傳遞多種資料,然後在槽函式接受這些資料,這樣就可以很靈活的實現一些業務邏輯
簡單的一個例項:簡單的自定義訊號與槽
from PyQt5.QtCore import QObject,pyqtSignal #訊號物件 class QTypeSignal(QObject): #定義一個訊號 # sendmsg = pyqtSignal(object) #todo 優化 多個引數傳遞 sendmsg=pyqtSignal(str,str) def __init__(self): super(QTypeSignal,self).__init__() def run( self ): #發射訊號 #self.sendmsg.emit('hell') #todo 優化 發射多個引數 self.sendmsg.emit('第一引數','第二個引數') #槽物件 class QTypeSlot(QObject): def __init__(self): super(QTypeSlot,self).__init__() #槽物件中的槽函式 # def get( self,msg ): # print("QSlot get msg => " + msg) #todo 優化 多個引數 def get( self,msg1,msg2 ): print("QSlot get msg => " + msg1+' '+msg2) if __name__ == '__main__': #例項化訊號物件 send=QTypeSignal() #例項化槽物件 slot=QTypeSlot() #1 print('_____-把訊號繫結到槽函式上_____') send.sendmsg.connect(slot.get) send.run() print('_____-把訊號與槽函式解綁_____') send.sendmsg.disconnect(slot.get) send.run()
訊號與槽連線的主要步驟如下
第一步:生成一個訊號
#定義一個訊號
# sendmsg = pyqtSignal(object)
#todo 優化 多個引數傳遞
sendmsg=pyqtSignal(str,str)
第二步:將訊號與槽函式連線起來
print('_____-把訊號繫結到槽函式上_____')
send.sendmsg.connect(slot.get)
第三步:槽函式接受資料
def get( self,msg2 ):
print("QSlot get msg => " + msg1+' '+msg2)
第四步:發射訊號的實現
self.sendmsg.emit('第一引數','第二個引數')
第五步:將訊號繫結到槽物件中的槽函式上,所以槽函式能收到所發射的訊號,自此,資料傳遞成功,就是這麼簡單,如果需要傳遞多個數據,可以自定義引數型別與數目
send=QTypeSignal()
slot=QTypeSlot()
#
print('_____-把訊號繫結到槽函式上_____')
send.sendmsg.connect(slot.get)
三:使用裝飾器訊號與槽
1、使用格式
@PyQt5.QtCore.pyqtSlot(引數) def on_傳送者物件名稱_發射訊號名稱(self,引數): pass
2、注意點,使用裝飾器必須定義兩個東西
QMetaObject.connectSlotsByName(self)
給需要繫結事件的定義一個id(self.btn.setObjectName('名稱'))
3、按鈕的普通事件
... class Window(QWidget): def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) self.setWindowTitle('裝飾器訊號與槽') self.resize(500,500) self.move(400,200) self.btn = QPushButton('按鈕',self) self.init_ui() def init_ui(self): self.btn.clicked.connect(self.btn_hand) @staticmethod def btn_hand(): print('使用connect點選了按鈕') ...
4、使用裝飾器後的事件
... class Window(QWidget): def __init__(self,self) self.init_ui() # 要在載入元件後使用 QMetaObject.connectSlotsByName(self) def init_ui(self): # 這個地方定義的名字直接在下面使用 self.btn.setObjectName('btn') @pyqtSlot() def on_btn_clicked(self): print('使用裝飾器點選了按鈕')
本文主要講解了PyQt5訊號與槽基礎使用方法與例項,更多關於PyQt5訊號與槽的知識請檢視下面的相關連結