python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
时间:2020-03-06来源:电脑系统城作者:电脑系统城
这篇文章主要介绍了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、定义槽函数
定义一个槽函数,它有多个不同的输入参输数
- def signalCall1( self ):
- print("signal1 emit")
- def signalCall2( self,val ):
- print('signal2 emit,value:',val)
- def signalCall3( self,val,text ):
- print('signall3 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 signalCall7( self,val ):
- print('signal6 ovetload emit',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、实例
完整代码如下
- from PyQt5.QtCore import QObject,pyqtSignal
- class CusSignal(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('第六')
- #槽函数
- def signalCall1( self ):
- print("signal1 emit")
- def signalCall2( self,val ):
- print('signal2 emit,value:',val)
- def signalCall3( self,val,text ):
- print('signall3 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 signalCall7( self,val ):
- print('signal6 ovetload emit',val)
- if __name__ == '__main__':
- custSignal=CusSignal()
运行结果如下
自定义参数的传递
在pyqt编程过程中,经常会遇到给槽函数传递自定义参数的情况,比如有一个信号与槽函数的连接是
button.clicked.connect(show_page)
我们知道对于clicked信号,它是没有参数的,对于show_page函数来说,希望他可以接受参数,希望show_page函数如下这样
def show_page(self,name):
print(name',点击了')
于是就会产生一个问题,信号发出的参数个数与槽函数接受的参数个数不一,那么如何解决这个问题呢,这里提供两种解决方法;
第一种:lamdba表达式
第二种:使用functools中的partial函数
两种方法,下面均已写上,自己可运行查看,注意注释
实例如下
- import sys
- from PyQt5.QtWidgets import *
- from functools import partial
- class WinForm(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)
- def onButtonClick( 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信号与槽知识请查看下面的相关链接
相关信息
-
Go json反序列化“null“的问题解决
有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map 1
2
3
4
5
6
7
8
9
10
11
12
13
14...
2023-03-15
-
Golang 字符串转time类型实现
由于数据库的类型为Data 类型,所以插入数据库的时候我先把前端传入的string类型的时间转为Time 再插入。
Go 提供了两种插入的方式,即time.Parse 和 time.ParseInLocation 。两种方式,他们的差异比较大。...
2023-03-09