PyQt 5信號與槽的幾種高級玩法
參考:http://www.broadview.com.cn/article/824
from PyQt5.QtCore import QObject , pyqtSignal class CustSignal(QObject): #聲明無參數的信號 signal1 = pyqtSignal() #聲明帶一個int類型參數的信號 signal2 = pyqtSignal(int) #聲明帶int和str類型參數的信號 signal3 = pyqtSignal(int,str) #聲明帶一個列表類型參數的信號 signal4 = pyqtSignal(list) #聲明帶一個字典類型參數的信號 signal5 = pyqtSignal(dict) #聲明一個多重載版本的信號,包括帶int和str類型參數的信號和帶str類型參數的信號 signal6 = pyqtSignal([int,str], [str]) def __init__(self,parent=None): super(CustSignal,self).__init__(parent) #將信號連接到指定槽函數 self.signal1.connect(self.signalCall1) self.signal2.connect(self.signalCall2) self.signal3.connect(self.signalCall3) self.signal4.connect(self.signalCall4) self.signal5.connect(self.signalCall5) self.signal6[int,str].connect(self.signalCall6) self.signal6[str].connect(self.signalCall6OverLoad) #發射信號 self.signal1.emit() self.signal2.emit(1) self.signal3.emit(1,"text") self.signal4.emit([1,2,3,4]) self.signal5.emit({"name":"wangwu","age":"25"}) self.signal6[int,str].emit(1,"text") self.signal6[str].emit("text") def signalCall1(self): print("signal1 emit") def signalCall2(self,val): print("signal2 emit,value:",val) def signalCall3(self,val,text): print("signal3 emit,value:",val,text) def signalCall4(self,val): print("signal4 emit,value:",val) def signalCall5(self,val): print("signal5 emit,value:",val) def signalCall6(self,val,text): print("signal6 emit,value:",val,text) def signalCall6OverLoad(self,val): print("signal6 overload emit,value:",val) if __name__ == '__main__': custSignal = CustSignal()
運行結果:
signal1 emit signal2 emit,value: 1 signal3 emit,value: 1 text signal4 emit,value: [1, 2, 3, 4] signal5 emit,value: {'name': 'wangwu', 'age': '25'} signal6 emit,value: 1 text signal6 overload emit,value: text
自己寫了一遍:
效果如下:
完整代碼:
from PyQt5.QtWidgets import (QApplication,QWidget,QPushButton,QTextBrowser,QGridLayout) from PyQt5.QtCore import Qt,pyqtSignal import sys class Example(QWidget): # 聲明無參數的信號 signal1 = pyqtSignal() # 聲明帶一個int類型參數的信號 signal2 = pyqtSignal(int) # 聲明帶int和str類型參數的信號 signal3 = pyqtSignal(int, str) # 聲明帶一個列表類型參數的信號 signal4 = pyqtSignal(list) # 聲明帶一個字典類型參數的信號 signal5 = pyqtSignal(dict) # 聲明一個多重載版本的信號,包括帶int和str類型參數的信號和帶str類型參數的信號 signal6 = pyqtSignal([int, str], [str]) def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.setGeometry(300,300,450,380) self.setWindowTitle("自定義信號與槽練習") gridLayout = QGridLayout() self.btn1 = QPushButton("無參數信號") self.btn2 = QPushButton("int信號") self.btn3 = QPushButton("int和str信號") self.btn4 = QPushButton("list信號") self.btn5 = QPushButton("dict信號") self.btn6 = QPushButton("多重載信號[int,str],[str]") self.textBrowser = QTextBrowser() gridLayout.addWidget(self.textBrowser,0,0,4,12) gridLayout.addWidget(self.btn1,5,0,1,2) gridLayout.addWidget(self.btn2,5,2,1,2) gridLayout.addWidget(self.btn3,5,4,1,2) gridLayout.addWidget(self.btn4,5,6,1,2) gridLayout.addWidget(self.btn5,5,8,1,2) gridLayout.addWidget(self.btn6,5,10,1,2) self.setLayout(gridLayout) self.mytxt = "" #空信號 self.btn1.clicked.connect(self.mySignal1) self.signal1.connect(self.mySlotFunc1) #int數字信號 self.btn2.clicked.connect(self.mySignal2) self.signal2.connect(self.mySlotFunc2) #int和str(數字和字符串)信號 self.btn3.clicked.connect(self.mySignal3) self.signal3.connect(self.mySlotFunc3) #list列表信號 self.btn4.clicked.connect(self.mySignal4) self.signal4.connect(self.mySlotFunc4) #dict字典信號 self.btn5.clicked.connect(self.mySignal5) self.signal5.connect(self.mySlotFunc5) # 多重載信號 def mySignal1(self): self.signal1.emit() def mySlotFunc1(self): self.mytxt += "無參數的信號" self.textBrowser.setText(self.mytxt) def mySignal2(self): self.signal2.emit(123456) def mySlotFunc2(self,val): self.textBrowser.setText(str(val)) def mySignal3(self): self.signal3.emit(123456,"這是我的電話號碼:") def mySlotFunc3(self, val,text): self.textBrowser.setText(text+str(val)) def mySignal4(self): self.signal4.emit([1,5,9,0,0,0,0,1,2,3,4]) def mySlotFunc4(self,li): print(li) for i in li: self.mytxt += str(i) # print(self.mytxt) self.textBrowser.setText(self.mytxt) def mySignal5(self): self.signal5.emit({"phone":90001111, "addr":["浙江","寧波"]}) def mySlotFunc5(self,mydict): self.textBrowser.setText(str(mydict["phone"])+str(mydict["addr"][0])+str(mydict["addr"][1])) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_())