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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM