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

作者:jia666666 时间:2022-02-07 05:22:10 

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

来源:https://blog.csdn.net/jia666666/article/details/81775378

标签:PyQt5,信号,槽
0
投稿

猜你喜欢

  • 利用 Python ElementTree 生成 xml的实例

    2022-04-14 08:32:48
  • mysql中left join设置条件在on与where时的用法区别分析

    2024-01-12 15:05:52
  • python中for循环把字符串或者字典添加到列表的方法

    2022-05-12 19:16:44
  • python爬虫 urllib模块url编码处理详解

    2021-09-13 02:24:37
  • python之 matplotlib和pandas绘图教程

    2021-07-16 01:50:11
  • Python数据类型最全知识总结

    2022-01-13 14:18:48
  • js图片随机显示技巧

    2007-08-19 20:20:00
  • c#操作附加数据库的方法

    2024-01-22 06:10:06
  • Git Submodule管理项目子模块的使用

    2023-10-06 20:34:57
  • Mootools 1.2教程(8)——输入过滤第一部分(数字)

    2008-11-27 13:01:00
  • 这十大Python库你真应该知道

    2022-09-20 00:09:03
  • django中forms组件的使用与注意

    2021-03-11 00:14:04
  • MySQL为何不建议使用默认值为null列

    2024-01-22 17:11:10
  • 《写给大家看的设计书》阅读笔记之亲密性原则

    2009-07-08 20:02:00
  • 用Python创建简易网站图文教程

    2023-03-09 20:37:57
  • 详解MySQL数据库中字符串的正确使用

    2010-06-20 15:01:00
  • 如何从Python字符串中删除最后一个分号或者逗号

    2023-12-22 07:29:53
  • PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形

    2022-06-17 02:14:03
  • Python实现计算图像RGB均值方式

    2024-01-01 20:50:31
  • 解决vue3打包过后空白页面的情况

    2024-05-09 10:43:00
  • asp之家 网络编程 m.aspxhome.com