从零开始学Pyqt5之【自定义信号与槽函数及多种参数传递方式】
本文主要是介绍以自定义的方式定义信号与槽函数,并传递参数。
自定义信号的一般流程如下:
(1) 定义信号。
(2)定义槽函数。
(3)连接信号与槽函数。
(4)发射信号。
1.定义信号
通过类成员变量定义信号对象。
class MyWidget (QWidget):
Signal_NoParameters = PyqtSignal()
Signal_OneParameter = PyqtSignal(int)
Signal_OneParameter_Overload = PyqtSignal((int],[str])
Signal_TwoParameters = PyqtSignal(int,str)
Signal_TwoParameters_Overload = PyqtSignal([int,int], [int,str])
2.定义槽函数
定义一个槽函数,它有多个不同的输入参数。
class Mywidget(Qwidget):
def setValue_NoParameters(self):
pass
def setValue_OneParameter(self,nIndex):
pass
def setValue_OneParameter_String(self,szIndex) :
pass
def setValue_TwoParameters(self,x,y):
pass
def setValue_TwoParameters_String(self,x,ystr):
pass
3.连接信号与槽函数
通过connect方法连接信号与槽函数或者可调用对象。
app = QApplication(sys.argv)
widget = MyWidget()
widget.Signal_NoParameters.connect (self.setValue_NoParameters)
widget.Signal_OneParameter.connect (self.setValue_OneParameter)
widget.Signal_OneParameter_Overload[int].connect (self.setValue_OneParameter)
widget.Signal_OneParameter_Overload[str].
connect(self.setValue_OneParameter_String)
widget.Signal_TwoParameters.connect(self.setValue_TwoParameters)
widget.Signal_TwoParameters_Overload[int,int].
connect (self.setValue_TwoParameters)
widget.Signal_TwoParameters_Overload[int,str]·
connect (self.setValue_TwoParameters_String)
widget.show ()
4.发射信号
通过emit方法发射信号。
class Mywidget (Qwidget):
def mousePressEvent (seli, event):
self.Signal_NoParameters.emit()
self.Signal_OneParameter.emit(1)
self.Signal_OneParameter_Overload.emit(1)
self.Signal_OneParameter_Overload.emit ("abe")
self.Signal_TwoParameters.emit(1, "abc")
self.Signal_TwoParameters_Overload.emit(1,2)
self.Signal_TwoParameters_Overload.emit (1,"abc")
代码示例
from PyQt5.QtCore import QObject , pyqtSignal
class CustSignal(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(CustSignal,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.signalCall6OverLoad)
self.signal1.emit()
self.signal2.emit(1)
self.signal3.emit(1,"text")
self.signal4.emit([1,2,3,4])
self.signal5.emit({"name":"wangwu","age":"25"})
self.signal6[int,str].emit(1,"text")
self.signal6[str].emit("text")
def signalCall1(self):
print("signal1 emit")
def signalCall2(self,val):
print("signal2 emit,value:",val)
def signalCall3(self,val,text):
print("signal3 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 signalCall6OverLoad(self,val):
print("signal6 overload emit,value:",val)
if __name__ == '__main__':
custSignal = CustSignal()
运行结果:
|