python PyQt5(自定义)信号与槽使用及说明

 更新时间:2022年12月16日 14:51:59   作者:来包番茄沙司  
这篇文章主要介绍了python PyQt5(自定义)信号与槽使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

所谓PyQt5高级自定义信号与槽,指的就是我们可以以自己喜欢的方式定义信号与槽函数,并传递参数,自定义信号的一般流程如下

  • 定义信号
  • 定义槽函数
  • 连接信号与槽函数
  • 发射信号

1 定义信号

PyQt5通过类成员变量定义信号对象

from PyQt5.QtCore import pyqtSignal
# 无参数的信号
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编程过程中,经常会遇到给槽函数传递自定义参数的情况,比如有一个信号与槽函数的连接是

我们知道对于clicked信号,它是没有参数的,对于show_page函数来说,希望他可以接受参数,希望show_page函数如下这样

def show_page(self,name):
    print(name',点击了')

于是就会产生一个问题,信号发出的参数个数与槽函数接受的参数个数不一,那么如何解决这个问题呢,这里提供两种解决方法;

lamdba表达式

使用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))

实例

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数据分析处理进行炒股实战行情

    利用python数据分析处理进行炒股实战行情

    这篇文章主要介绍了利用python数据分析进行炒股实战行情,本文主要介绍三部分:数据采集,数据预处理,利用SVM算法进行建模,本文仅供参考借鉴
    2021-08-08
  • 浅谈pytorch中的BN层的注意事项

    浅谈pytorch中的BN层的注意事项

    这篇文章主要介绍了浅谈pytorch中的BN层的注意事项,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python实现tail实时查看服务器日志示例

    python实现tail实时查看服务器日志示例

    今天小编就为大家分享一篇python实现tail实时查看服务器日志示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python JWT认证与pyjwt包详细介绍

    Python JWT认证与pyjwt包详细介绍

    JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密,这篇文章主要介绍了Python JWT认证与pyjwt包简介,需要的朋友可以参考下
    2023-05-05
  • Python遍历目录下文件、读取、千万条数据合并详情

    Python遍历目录下文件、读取、千万条数据合并详情

    这篇文章主要介绍了Python遍历目录下文件、读取、千万条数据合并详情,对文件夹和文件进行属性判断,首先对文件夹进行遍历,看文件夹里有什么样的文件,读取出文件夹中的所有文件,下面文章将详细介绍该内容,需要的小伙伴可以参考一下
    2022-01-01
  • 完美解决在oj中Python的循环输入问题

    完美解决在oj中Python的循环输入问题

    今天小编就为大家分享一篇完美解决在oj中Python的循环输入问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python实现飞机大战小游戏

    python实现飞机大战小游戏

    这篇文章主要为大家详细介绍了python实现飞机大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Python实现Word和TXT文件格式之间的相互转换

    Python实现Word和TXT文件格式之间的相互转换

    Word文档(.doc或.docx)和纯文本文件(.txt)是两种常用的文件格式,本文将详细介绍如何使用Python实现Word和TXT文件格式之间的相互转换,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-07-07
  • python生成单位阵或对角阵的三种方式小结

    python生成单位阵或对角阵的三种方式小结

    这篇文章主要介绍了python生成单位阵或对角阵的三种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Python实现向PPT中插入表格与图片的方法详解

    Python实现向PPT中插入表格与图片的方法详解

    这篇文章将带大家学习一下如何在PPT中插入表格与图片以及在表格中插入内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-05-05

最新评论