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('右键被单击')