PyQt信号与槽之信号与槽的高级玩法(三)

高级自定义信号与槽

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

  • 定义信号
  • 定义槽函数
  • 连接信号与槽函数
  • 发射信号
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):
    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_())

运行效果如图所示
这里写图片描述这里写图片描述

代码分析

重点解释
使用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))
  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jia666666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值