pyqt信号与槽

499 阅读1分钟

高级自定义信号与槽(一般流程)

1. 定义信号

2. 定义槽函数

3. 连接信号与槽函数

4. 发射信号

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

class MySignal(Qwidget):
    # 无参信号
    signal_noParameters = pyqtSignal()
    # 带一个参数(int)的信号
    signal_intparameters = pyqtSignal(int)
    # 带一个参数(整形或者字符串)的重载信号
    signal_intparameters_overload = pyqtSignal([int], [str])
    # 带两个参数(整形,字符串)的信号
    signal_twoparameters = pyqtSignal(int, str)
    # 带两个参数([整型, 整形],[整形,字符串])的重载信号
    signal_twoparameters_overload = pyqtSignal([int, int], [int, str])

定义槽函数

class MYSlot(Qwidget):
    def setValue_noparameters(self):
        """ 无参槽函数 """

    def setValue_one_int_parameters(self, int_para):
        """ 一整形参槽函数 """

    def setValue_one_s_parameters(self, str_para):
        """ 一字符串参槽函数 """

    def setValue_two_parameters(self, x, y):
        """ 两个整形参槽函数 """

    def setValue_two_parameters(self, x, y):
        """ 两个参(int,str)槽函数 """

连接槽函数

signal1 = MySignal().signal_noParameters
signal2 = MySignal().signal_twoparameters_int_str
signal3 = MySignal().signal_twoparameters__int_str_overload

slot1 = MySlot().setValue_noparameters
slot2 = MySlot().setValue_twoparameters_int_str
slot3 = MySlot().setValue_twoparameters_int_str_overload

signal1.connect(slot1)
signal2.connect(slot12)
signal3[int, str].connect(slot3)

singal1.emit()
singal2.emit(1, '啊哈')
singal3.emit(2, 'abc')

使用自定义的函数

  1. 使用lambda表达式

    signal.connect(lambda: slot(parameters))
    
    def slot(parameters):
        pass    
    
  2. 使用functools中的partial函数

    button1.clicked.connect(partial(self.onButtonClick, 1)) 
    

装饰器信号与槽

@PyQt5.QtCore.pyqtSlot(参数)
def on_发送者对象名称_发射信号名称(self, 参数):
    pass