DDR爱好者之家 Design By 杰米
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()
运行结果如下
自定义参数的传递
在pyqt编程过程中,经常会遇到给槽函数传递自定义参数的情况,比如有一个信号与槽函数的连接是
button.clicked.connect(show_page)
我们知道对于clicked信号,它是没有参数的,对于show_page函数来说,希望他可以接受参数,希望show_page函数如下这样
def show_page(self,name):
"htmlcode">
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_())运行效果如图所示
代码分析
重点解释
使用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信号与槽知识请查看下面的相关链接
DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米
暂无评论...
更新日志
2024年11月25日
2024年11月25日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]