• python PyQt5(自定义)信号与槽详解与实例



    所谓PyQt5高级自定义信号与槽,指的就是我们可以以自己喜欢的方式定义信号与槽函数,并传递参数,自定义信号的一般流程如下

    • 定义信号
    • 定义槽函数
    • 连接信号与槽函数
    • 发射信号

    1 定义信号

    PyQt5通过类成员变量定义信号对象

    from PyQt5.QtCore import pyqtSignal
    # 无参数的信号
    signal1 = pyqtSignal()
    # 带一个参数(整数)的信号
    signal2 = pyqtSignal(int)
    # 带两个参数(整数,字符串)的信号
    signal3 = pyqtSignal(int, str)
    # 带一个参数(列表)的信号
    signal4 = pyqtSignal(list)
    # 带一个参数(字典)的信号
    signal5 = pyqtSignal(dict)
    # 带(整数 字符串)或者(字符串)的信号
    signal6 = pyqtSignal([int, str], [str])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2 定义槽函数

    定义一个槽函数,它有多个不同的输入参数

    def signalCall1(self):
      print("signal1 emit")
    def signalCall2(self, val):
      print('signal2 emit, value:', val)
    def signalCall3(self, val, text):
      print('signall3 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 signalCall7(self, val):
      print('signal6 ovetload emit',val)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3 连接信号与槽函数

    # 信号与槽函数的连接
    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.signalCall7)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4 发射信号

    #信号发射
    self.signal1.emit()
    self.signal2.emit(1)
    self.signal3.emit(1,'第三个')
    self.signal4.emit([1,2,3,4])
    self.signal5.emit({"name":'JIA','age':'21'})
    self.signal6[int,str].emit(1,"第六")
    self.signal6[str].emit('第六')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5 实例

    from PyQt5.QtCore import QObject,pyqtSignal
    class CusSignal(QObject):
      #无参数的信号
      signal1 = pyqtSignal()
      #带一个参数(整数)的信号
      signal2 = pyqtSignal(int)
      #带两个参数(整数,字符串)的信号
      signal3 = pyqtSignal(int,str)
      #带一个参数(列表)的信号
      signal4 = pyqtSignal(list)
      #带一个参数(字典)的信号
      signal5 = pyqtSignal(dict)
      #带(整数 字符串)或者(字符串)的信号
      signal6 = pyqtSignal([int,str],[str])
      def __init__(self, parent=None):
        super(CusSignal, 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.signalCall7)
        #信号发射
        self.signal1.emit()
        self.signal2.emit(1)
        self.signal3.emit(1,'第三个')
        self.signal4.emit([1,2,3,4])
        self.signal5.emit({"name":'JIA','age':'21'})
        self.signal6[int,str].emit(1,"第六")
        self.signal6[str].emit('第六')
      #槽函数
      def signalCall1( self ):
        print("signal1 emit")
      def signalCall2( self,val ):
        print('signal2 emit,value:',val)
      def signalCall3( self,val,text ):
        print('signall3 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 signalCall7(self, val ):
        print('signal6 ovetload emit', val)
    if __name__ == '__main__':
      custSignal = CusSignal()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    运行结果:
    在这里插入图片描述

    自定义参数的传递及实例

    在pyqt编程过程中,经常会遇到给槽函数传递自定义参数的情况,比如有一个信号与槽函数的连接是
    button.clicked.connect(show_page)
    我们知道对于clicked信号,它是没有参数的,对于show_page函数来说,希望他可以接受参数,希望show_page函数如下这样

    def show_page(self,name):
        print(name',点击了')
    
    • 1
    • 2

    于是就会产生一个问题,信号发出的参数个数与槽函数接受的参数个数不一,那么如何解决这个问题呢,这里提供两种解决方法;

    lamdba表达式

    使用lambda表达式传递按钮数字给槽函数,当然还可以传递其他东西,甚至是按钮本身

    button1.clicked.connect(lambda :self.onButtonClick(1))
    button2.clicked.connect(lambda :self.onButtonClick(2))
    
    • 1
    • 2

    使用functools中的partial函数

    button1.clicked.connect(partial(self.onButtonClick, 1))
    button2.clicked.connect(partial(self.onButtonClick, 2))
    
    • 1
    • 2

    实例

    import sys
    from PyQt5.QtWidgets import *
    from functools import partial
    class WinForm(QMainWindow):
      def __init__(self,parent=None):
        super(WinForm, self).__init__(parent)
        #实例化两个按钮
        button1=QPushButton('Button1')
        button2=QPushButton('Button2')
        #todo 第一种方法
        #单击信号关联槽函数,利用Lanbda表达式传递一个参数
        # button1.clicked.connect(lambda :self.onButtonClick(1))
        # button2.clicked.connect(lambda :self.onButtonClick(2))
        #
        #todo 第二种方法
        button1.clicked.connect(partial(self.onButtonClick, 1))
        button2.clicked.connect(partial(self.onButtonClick, 2))
        #实例化窗口
        main=QWidget()
        #设置窗口的布局,并向其中添加控件
        layout=QHBoxLayout(main)
        layout.addWidget(button1)
        layout.addWidget(button2)
        #设置为中央控件
        self.setCentralWidget(main)
      def onButtonClick( self,n ):
        #弹窗信息提示框,输出被点击的信息
        print("Button {0}".format(n))
        QMessageBox.information(self,'信息提示框','Button {0}'.format(n))
    if __name__ == '__main__':
      app=QApplication(sys.argv)
      form=WinForm()
      form.show()
      sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    参考链接:https://blog.csdn.net/weixin_34987818/article/details/113969835

  • 相关阅读:
    行业案例 | 全面防护 赛宁助力能源工控安全建设
    8、AQS
    【4-5章】Spark编程基础(Python版)
    生成patch
    【Java八股文总结】之JVM
    Linux_aarch64_head.S到main.c的环境建立
    防抖跟节流
    GStreamer MIME类型
    一个简易的makefile模板
    vscode启动不了,折腾了半天发现已经不支持win7
  • 原文地址:https://blog.csdn.net/weixin_45928096/article/details/126928975