python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例


Posted in Python onMarch 06, 2020

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()

运行结果如下

python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例

自定义参数的传递

在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_())

运行效果如图所示

python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例

代码分析

重点解释

使用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信号与槽知识请查看下面的相关链接

Python 相关文章推荐
python读取csv文件示例(python操作csv)
Mar 11 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
Python3中的2to3转换工具使用示例
Jun 12 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 Python
python爬虫实战之最简单的网页爬虫教程
Aug 13 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
用python一行代码得到数组中某个元素的个数方法
Jan 28 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 Python
python实现QQ邮箱发送邮件
Mar 06 #Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 #Python
关于Python字符串显示u...的解决方式
Mar 06 #Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
Mar 06 #Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 #Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 #Python
Python使用ElementTree美化XML格式的操作
Mar 06 #Python
You might like
PHP脚本数据库功能详解(上)
2006/10/09 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
php查看网页源代码的方法
2015/03/13 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
如何运行Python程序的方法
2013/04/21 Python
Python中MySQL数据迁移到MongoDB脚本的方法
2016/04/28 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
如何更优雅地写python代码
2019/07/02 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
amazeui页面分析之登录页面的示例代码
2020/08/25 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
销售职业生涯规划范文
2014/03/14 职场文书
项目投资合作意向书
2014/07/29 职场文书