1. 程式人生 > 程式設計 >python GUI庫圖形介面開發之PyQt5訊號與槽基礎使用方法與例項

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_())

執行指令碼,顯示效果如下

python GUI庫圖形介面開發之PyQt5訊號與槽基礎使用方法與例項python GUI庫圖形介面開發之PyQt5訊號與槽基礎使用方法與例項

這個例子將一個按鈕物件的內建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()

python GUI庫圖形介面開發之PyQt5訊號與槽基礎使用方法與例項

訊號與槽連線的主要步驟如下

第一步:生成一個訊號

#定義一個訊號

# 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訊號與槽的知識請檢視下面的相關連結