公众号:uncle39py

V1

2023/05/05阅读:15主题:默认主题

100.自定义信号

通过信号与槽,可以实现两个对象之间的通信

一.自定义信号的3个步骤:

from PyQt5.QtCore import *

class MySignal(QObject):
    #步骤1:
    #定义一个类属性的信号对象,object为向外界传递的参数类型,发射的时候具体传递
    #参数类型可以写多个,比如pyqtSignal(str,int,int)
    sendmsg = pyqtSignal(object) 
    
    
    def run(self):
        #步骤3:触发信号,传递参数,触发信号后会去执行绑定的槽函数
        #参数的类型和个数要跟定义信号时一致,比如self.sendmsg.emit("hello",3,4)
        self.sendmsg.emit("hello"
        

class MySlot(QObject):
    def get(self,msg):
        print("信息:"+msg)

if __name__ == '__main__':
    signal = MySignal()
    slot = MySlot()
    
    #步骤2:信号与槽的绑定
    signal.sendmsg.connect(slot.get)
    signal.run() #步骤3:触发信号

二.装饰器自动连接信号与槽

信号与槽之间连接的第二种写法(常用与QtDesigner自动生成的代码中)

from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("装饰器自动连接信号与槽")
        self.resize(500,500)
        self.init_ui()

    def init_ui(self):
        btn = QPushButton("按钮",self)
        btn.setObjectName("btn")

        #1.作用是对self内部所有的子孙控件,按照objectName自动连接到对应的槽函数:on_objectName_信号
        #2.必须放在最后面,这个时候self内部才会有已经创建了的子孙控件
        QMetaObject.connectSlotsByName(self)

    @pyqtSlot(bool)   
    def on_btn_clicked(self,val):
        print("按钮被点击")
    #bool为信号向外界传递的参数

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())

分类:

后端

标签:

后端

作者介绍

公众号:uncle39py
V1