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 MySQLdb模块连接操作mysql数据库实例
Apr 08 Python
python实现连接mongodb的方法
May 08 Python
python实现web方式logview的方法
Aug 10 Python
Python网络爬虫实例讲解
Apr 28 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
python3.4实现邮件发送功能
May 28 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
如何更优雅地写python代码
Jul 02 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
基于python读取.mat文件并取出信息
Dec 16 Python
Django中文件上传和文件访问微项目的方法
Apr 27 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基本语法总结
2014/09/06 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
yii2安装详细流程
2018/05/23 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
详解如何运行vue项目
2019/04/15 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
详解JS预解析原理
2020/06/16 Javascript
对pandas中Series的map函数详解
2018/07/25 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
财务经理岗位职责
2013/11/09 职场文书
先进典型事迹材料
2014/12/29 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers