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('右键被单击')
来源: http://www.bubuko.com/infodetail-3240802.html