系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 脚本中心 > 其它 > 详细页面

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

时间:2020-03-06来源:电脑系统城作者:电脑系统城

这篇文章主要介绍了python GUI库图形界面开发之PyQt5信号与槽的高级知识(自定义信号与槽)详解与实例,需要的朋友可以参考下

PyQt5信号与槽高级自定义信号与槽

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

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

1、定义信号

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


 
  1. #无参数的信号
  2. signal1=pyqtSignal()
  3. #带一个参数(整数)的信号
  4. signal2=pyqtSignal(int)
  5. #带两个参数(整数,字符串)的信号
  6. signal3=pyqtSignal(int,str)
  7. #带一个参数(列表)的信号
  8. signal4=pyqtSignal(list)
  9. #带一个参数(字典)的信号
  10. signal5=pyqtSignal(dict)
  11. #带(整数 字符串)或者(字符串)的信号
  12. signal6=pyqtSignal([int,str],[str])

2、定义槽函数

定义一个槽函数,它有多个不同的输入参输数


 
  1. def signalCall1( self ):
  2. print("signal1 emit")
  3. def signalCall2( self,val ):
  4. print('signal2 emit,value:',val)
  5. def signalCall3( self,val,text ):
  6. print('signall3 emit,value:',val,text)
  7. def signalCall4( self,val ):
  8. print('signal4 emit,value:',val)
  9. def signalCall5( self,val ):
  10. print('signal5 emit,value',val)
  11. def signalCall6( self,val,text ):
  12. print('signal6 emit,value',val,text)
  13. def signalCall7( self,val ):
  14. print('signal6 ovetload emit',val)

3、连接信号与槽函数


 
  1. #信号与槽函数的链接
  2. self.signal1.connect(self.signalCall1)
  3. self.signal2.connect(self.signalCall2)
  4. self.signal3.connect(self.signalCall3)
  5. self.signal4.connect(self.signalCall4)
  6. self.signal5.connect(self.signalCall5)
  7. self.signal6[int,str].connect(self.signalCall6)
  8. self.signal6[str].connect(self.signalCall7)

4、发射信号


 
  1. #信号发射
  2. self.signal1.emit()
  3. self.signal2.emit(1)
  4. self.signal3.emit(1,'第三个')
  5. self.signal4.emit([1,2,3,4])
  6. self.signal5.emit({"name":'JIA','age':'21'})
  7. self.signal6[int,str].emit(1,"第六")
  8. self.signal6[str].emit('第六')

5、实例

完整代码如下


 
  1. from PyQt5.QtCore import QObject,pyqtSignal
  2. class CusSignal(QObject):
  3. #无参数的信号
  4. signal1=pyqtSignal()
  5. #带一个参数(整数)的信号
  6. signal2=pyqtSignal(int)
  7. #带两个参数(整数,字符串)的信号
  8. signal3=pyqtSignal(int,str)
  9. #带一个参数(列表)的信号
  10. signal4=pyqtSignal(list)
  11. #带一个参数(字典)的信号
  12. signal5=pyqtSignal(dict)
  13. #带(整数 字符串)或者(字符串)的信号
  14. signal6=pyqtSignal([int,str],[str])
  15. def __init__(self,parent=None):
  16. super(CusSignal, self).__init__(parent)
  17. #信号与槽函数的链接
  18. self.signal1.connect(self.signalCall1)
  19. self.signal2.connect(self.signalCall2)
  20. self.signal3.connect(self.signalCall3)
  21. self.signal4.connect(self.signalCall4)
  22. self.signal5.connect(self.signalCall5)
  23. self.signal6[int,str].connect(self.signalCall6)
  24. self.signal6[str].connect(self.signalCall7)
  25. #信号发射
  26. self.signal1.emit()
  27. self.signal2.emit(1)
  28. self.signal3.emit(1,'第三个')
  29. self.signal4.emit([1,2,3,4])
  30. self.signal5.emit({"name":'JIA','age':'21'})
  31. self.signal6[int,str].emit(1,"第六")
  32. self.signal6[str].emit('第六')
  33. #槽函数
  34. def signalCall1( self ):
  35. print("signal1 emit")
  36. def signalCall2( self,val ):
  37. print('signal2 emit,value:',val)
  38. def signalCall3( self,val,text ):
  39. print('signall3 emit,value:',val,text)
  40. def signalCall4( self,val ):
  41. print('signal4 emit,value:',val)
  42. def signalCall5( self,val ):
  43. print('signal5 emit,value',val)
  44. def signalCall6( self,val,text ):
  45. print('signal6 emit,value',val,text)
  46. def signalCall7( self,val ):
  47. print('signal6 ovetload emit',val)
  48. if __name__ == '__main__':
  49. 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函数

两种方法,下面均已写上,自己可运行查看,注意注释

实例如下


 
  1. import sys
  2. from PyQt5.QtWidgets import *
  3. from functools import partial
  4. class WinForm(QMainWindow):
  5. def __init__(self,parent=None):
  6. super(WinForm, self).__init__(parent)
  7. #实例化两个按钮
  8. button1=QPushButton('Button1')
  9. button2=QPushButton('Button2')
  10. #todo 第一种方法
  11. #单击信号关联槽函数,利用Lanbda表达式传递一个参数
  12. # button1.clicked.connect(lambda :self.onButtonClick(1))
  13. # button2.clicked.connect(lambda :self.onButtonClick(2))
  14. #
  15. #todo 第二种方法
  16. button1.clicked.connect(partial(self.onButtonClick, 1))
  17. button2.clicked.connect(partial(self.onButtonClick, 2))
  18. #实例化窗口
  19. main=QWidget()
  20. #设置窗口的布局,并向其中添加控件
  21. layout=QHBoxLayout(main)
  22. layout.addWidget(button1)
  23. layout.addWidget(button2)
  24. #设置为中央控件
  25. self.setCentralWidget(main)
  26. def onButtonClick( self,n ):
  27. #弹窗信息提示框,输出被点击的信息
  28. print("Button {0}".format(n))
  29. QMessageBox.information(self,'信息提示框','Button {0}'.format(n))
  30. if __name__ == '__main__':
  31. app=QApplication(sys.argv)
  32. form=WinForm()
  33. form.show()
  34. 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信号与槽知识请查看下面的相关链接

分享到:

相关信息

  • Go json反序列化“null“的问题解决

    有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map 1 2 3 4 5 6 7 8 9 10 11 12 13 14...

    2023-03-15

  • Golang 字符串转time类型实现

    由于数据库的类型为Data 类型,所以插入数据库的时候我先把前端传入的string类型的时间转为Time 再插入。 Go 提供了两种插入的方式,即time.Parse 和 time.ParseInLocation 。两种方式,他们的差异比较大。...

    2023-03-09

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载