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中xlrd包的安装与处理Excel表格
Dec 16 Python
python 实现红包随机生成算法的简单实例
Jan 04 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
详解python字节码
Feb 07 Python
python线程池threadpool实现篇
Apr 27 Python
Python中存取文件的4种不同操作
Jul 02 Python
python实现多人聊天室
Mar 31 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
tensorboard显示空白的解决
Feb 15 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
May 17 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 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设计模式 Delegation(委托模式)
2011/06/26 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
js字符串转成JSON
2013/11/07 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
vue中appear的用法
2017/08/17 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
Python使用MONGODB入门实例
2015/05/11 Python
Python中的fileinput模块的简单实用示例
2015/07/09 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
Python 元组操作总结
2019/09/18 Python
opencv 阈值分割的具体使用
2020/07/08 Python
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
护理自荐信
2013/10/22 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
实习证明格式范文
2014/10/14 职场文书
企业安全生产规章制度
2015/08/06 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
Python os和os.path模块详情
2022/04/02 Python