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实现的几个常用排序算法实例
Jun 16 Python
Python装饰器使用示例及实际应用例子
Mar 06 Python
Python的装饰器模式与面向切面编程详解
Jun 21 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
python日志logging模块使用方法分析
May 23 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
简单了解python调用其他脚本方法实例
Mar 26 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
Python异常处理机制结构实例解析
Jul 23 Python
Python3 使用pip安装git并获取Yahoo金融数据的操作
Apr 08 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桌面中心(四) 数据显示
2007/03/11 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
python通过索引遍历列表的方法
2015/05/04 Python
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
浅谈五大Python Web框架
2017/03/20 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
夜大自我鉴定
2013/10/31 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
个人四风对照检查材料
2014/09/26 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
学生评语集锦
2015/01/04 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js