GUI学习之n——自定义信号

牧云@^-^@ 提交于 2019-12-01 09:07:10

PyQt中是依靠信号——槽的机制来运行,可是有些时候需要我们定义一下些新的信号以满足使用要求,例如按钮是没有右击的效果,那我们怎么创建一个新的信号呢?

首先要注意,新的信号是要以类属性的形式来定义

class BTN(QPushButton):
    rightClicked = pyqtSignal()    #类属性,建立新信号
    def __init__(self,*args,**kargs):
        super().__init__(*args,**kargs)

如果想要在信号中传递参数,就在定义信号的时候定义好参数的数据类型,比如我们想在点击右键的时候发送字符串‘右键被单击’

class BTN(QPushButton):
    rightClicked = pyqtSignal(str)    #类属性,建立新信号
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

    def mousePressEvent(self, evt):
        super().mousePressEvent(evt)       #非常重要,要先继承否则就成重构方法了
        if evt.button() == 2:              #鼠标右键对应button映射值为2
            self.rightClicked.emit('右键被单击')    #发射信号并传递参数

一定要注意在重构事件的时候先继承,否则就成完全重构了。如果把继承这一行注释掉以后,鼠标左键单击就没有事件了。

注意这里用了个很重要的方法

sign.emit()   #发送信号

有些信号使用时会被重载,传递的参数可以是不同类型的,使用时候需要选择信号数据类型,这时候要这样定义

class BTN(QPushButton):
    rightClicked = pyqtSignal([str],[int])    #类属性,建立新信号,指定参数类型
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

    def mousePressEvent(self, evt):
        super().mousePressEvent(evt)       #非常重要,要先继承否则就成重构方法了
        if evt.button() == 2:              #鼠标右键对应button映射值为2
            self.rightClicked[int].emit(123)    #发射信号并传递参数
            self.rightClicked[str].emit('右键被单击')

调用的时候就可以指名数据类型了

btn.rightClicked[str].connect(lambda val:print(val))#实例化后调用

还有一种情况是同时传递多个参数(带多个参数的时候也可以包含上面那种情况)

class BTN(QPushButton):
    rightClicked = pyqtSignal([str],[int,list])    #类属性,建立新信号,指定参数类型
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

    def mousePressEvent(self, evt):
        super().mousePressEvent(evt)       #非常重要,要先继承否则就成重构方法了
        if evt.button() == 2:              #鼠标右键对应button映射值为2
            self.rightClicked[int,list].emit(123,[1,2,3,4,5])    #发射信号时传递多个参数
            self.rightClicked[str].emit('右键被单击')

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!