python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
PyQt5信号与槽高级自定义信号与槽
所谓高级自定义信号与槽,指的就是我们可以以自己喜欢的方式定义信号与槽函数,并传递参数,自定义信号的一般流程如下
- 定义信号
- 定义槽函数
- 连接信号与槽函数
- 发射信号
1、定义信号
通过类成员变量定义信号对象
#无参数的信号 signal1=pyqtSignal() #带一个参数(整数)的信号 signal2=pyqtSignal(int) #带两个参数(整数,字符串)的信号 signal3=pyqtSignal(int,str) #带一个参数(列表)的信号 signal4=pyqtSignal(list) #带一个参数(字典)的信号 signal5=pyqtSignal(dict) #带(整数字符串)或者(字符串)的信号 signal6=pyqtSignal([int,str],[str])
2、定义槽函数
定义一个槽函数,它有多个不同的输入参输数
defsignalCall1(self):
print("signal1emit")
defsignalCall2(self,val):
print('signal2emit,value:',val)
defsignalCall3(self,val,text):
print('signall3emit,value:',val,text)
defsignalCall4(self,val):
print('signal4emit,value:',val)
defsignalCall5(self,val):
print('signal5emit,value',val)
defsignalCall6(self,val,text):
print('signal6emit,value',val,text)
defsignalCall7(self,val):
print('signal6ovetloademit',val)
3、连接信号与槽函数
#信号与槽函数的链接 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.signalCall7)
4、发射信号
#信号发射
self.signal1.emit()
self.signal2.emit(1)
self.signal3.emit(1,'第三个')
self.signal4.emit([1,2,3,4])
self.signal5.emit({"name":'JIA','age':'21'})
self.signal6[int,str].emit(1,"第六")
self.signal6[str].emit('第六')
5、实例
完整代码如下
fromPyQt5.QtCoreimportQObject,pyqtSignal
classCusSignal(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(CusSignal,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.signalCall7)
#信号发射
self.signal1.emit()
self.signal2.emit(1)
self.signal3.emit(1,'第三个')
self.signal4.emit([1,2,3,4])
self.signal5.emit({"name":'JIA','age':'21'})
self.signal6[int,str].emit(1,"第六")
self.signal6[str].emit('第六')
#槽函数
defsignalCall1(self):
print("signal1emit")
defsignalCall2(self,val):
print('signal2emit,value:',val)
defsignalCall3(self,val,text):
print('signall3emit,value:',val,text)
defsignalCall4(self,val):
print('signal4emit,value:',val)
defsignalCall5(self,val):
print('signal5emit,value',val)
defsignalCall6(self,val,text):
print('signal6emit,value',val,text)
defsignalCall7(self,val):
print('signal6ovetloademit',val)
if__name__=='__main__':
custSignal=CusSignal()
运行结果如下
自定义参数的传递
在pyqt编程过程中,经常会遇到给槽函数传递自定义参数的情况,比如有一个信号与槽函数的连接是
button.clicked.connect(show_page)
我们知道对于clicked信号,它是没有参数的,对于show_page函数来说,希望他可以接受参数,希望show_page函数如下这样
defshow_page(self,name):
print(name',点击了')
于是就会产生一个问题,信号发出的参数个数与槽函数接受的参数个数不一,那么如何解决这个问题呢,这里提供两种解决方法;
第一种:lamdba表达式
第二种:使用functools中的partial函数
两种方法,下面均已写上,自己可运行查看,注意注释
实例如下
importsys
fromPyQt5.QtWidgetsimport*
fromfunctoolsimportpartial
classWinForm(QMainWindow):
def__init__(self,parent=None):
super(WinForm,self).__init__(parent)
#实例化两个按钮
button1=QPushButton('Button1')
button2=QPushButton('Button2')
#todo第一种方法
#单击信号关联槽函数,利用Lanbda表达式传递一个参数
#button1.clicked.connect(lambda:self.onButtonClick(1))
#button2.clicked.connect(lambda:self.onButtonClick(2))
#
#todo第二种方法
button1.clicked.connect(partial(self.onButtonClick,1))
button2.clicked.connect(partial(self.onButtonClick,2))
#实例化窗口
main=QWidget()
#设置窗口的布局,并向其中添加控件
layout=QHBoxLayout(main)
layout.addWidget(button1)
layout.addWidget(button2)
#设置为中央控件
self.setCentralWidget(main)
defonButtonClick(self,n):
#弹窗信息提示框,输出被点击的信息
print("Button{0}".format(n))
QMessageBox.information(self,'信息提示框','Button{0}'.format(n))
if__name__=='__main__':
app=QApplication(sys.argv)
form=WinForm()
form.show()
sys.exit(app.exec_())
运行效果如图所示
代码分析
重点解释
使用lambda表达式传递按钮数字给槽函数,当然还可以传递其他东西,甚至是按钮本身
button1.clicked.connect(lambda:self.onButtonClick(1))
button2.clicked.connect(lambda:self.onButtonClick(2))
另一种方法是使用functools中的partial函数
button1.clicked.connect(partial(self.onButtonClick,1))
button2.clicked.connect(partial(self.onButtonClick,2))
本文主要介绍了PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例,更多关于PyQt5信号与槽知识请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。