1. 程式人生 > >【PyQt5-Qt Designer】pyqtSignal()-高階自定義訊號與槽

【PyQt5-Qt Designer】pyqtSignal()-高階自定義訊號與槽

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