PyQt信号与槽之信号与槽的高级用法(四)

装饰器信号与槽

所谓装饰器信号与槽,就是通过装饰器的方法来定义信号与槽函数,具体的使用方法如下

@PyQt5.QtCore.pyqtSlot(参数)
def on_发送者对象名称)发射信号名称(self,参数):
    pass

这种方法有效的前提是下面的函数已经执行:

QMetaObject.connectSlotsByName(QObject)

在上面的代码中,‘发送者对象名称’就是使用setObjectName函数设置的名称,因此自定义槽函数的命名规则也可以看做:on+使用setObjectName设置的名称+信号名称
接下来是具体的实例

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QPushButton
from PyQt5 import QtCore

class CustWidget(QWidget):
    def __init__(self,parent=None):
        super(CustWidget, self).__init__(parent)

        #创建按钮,添加到自身窗口中
        self.okButton=QPushButton('ok',self)
        #使用setObjectName设置对象名称
        self.okButton.setObjectName('okButton')

        #设置自身的布局为水平布局,并添加按钮控件到其中
        layout=QHBoxLayout(self)
        layout.addWidget(self.okButton)


        #TODo 第一种方法
        #self.okButton.clicked.connect(self.okButton_clicked)

    #def okButton_clicked( self ):
    #   print('单击了ok按钮')

        #第二种方法
        QtCore.QMetaObject.connectSlotsByName(self)
    @QtCore.pyqtSlot()
    def on_okButton_clicked( self ):
        print('单击了ok按钮')
if __name__ == '__main__':
    app=QApplication(sys.argv)
    win=CustWidget()
    win.show()
    sys.exit(app.exec_())

运行程序,显示效果如图,单击ok按钮,控制台打印预期调试信息
这里写图片描述

QtCore.QMetaObject.connectSlotsByName(self)

事实上,它是PyQt5中根据信号名称自动连接到槽函数的核心代码,这行代码用来将QObject中的子孙对象的某些对象按照其objectName连接到相应的槽函数,举个例子说名一下
假设代码QtCore.QMetaObject.connectSlotsByName(self)已经执行,则下面的代码

  @QtCore.pyqtSlot()
    def on_okButton_clicked( self ):
        print('单击了ok按钮')

会被自动识别为下面的代码

def __init__(self,parent=None):
    self.okButton.clicked.connect(self.okButton_clicked)
def okButton_clicked(self):
        print('单击了ok按钮')

信号与槽的断开与连接

有时候基于某些原因,想要临时或永久的断开某个信号与槽函数的连接,这就是要说的内容
一般把connect前面加上dis就是解除绑定的意思:即disconnect
实例如下

from PyQt5.QtCore import QObject,pyqtSignal

class SignalClass(QObject):
    #声明无参数的信号
    signal1=pyqtSignal()
    #声明带一个int类型参数的信号
    signal2=pyqtSignal(int)

    def __init__(self,parent=None):
        super(SignalClass, self).__init__(parent)
        #将signal1信号连接到两个槽函数
        self.signal1.connect(self.sig1Call)
        self.signal1.connect(self.sig2Call)

        #将signal2信号连接到信号1
        self.signal2.connect(self.signal1)

        #发射信号
        self.signal1.emit()
        self.signal2.emit(1)

        #断开信号与槽函数的关系
        self.signal1.disconnect(self.sig1Call)
        self.signal1.disconnect(self.sig2Call)
        self.signal2.disconnect(self.signal1)

        #绑定信号与槽函数
        self.signal1.connect(self.sig1Call)
        self.signal2.connect(self.sig1Call)

        #信号发射
        self.signal1.emit()
        self.signal2.emit(1)
    #输出信号1发射
    def sig1Call( self ):
        print('signal-1 emit')
    #输出信号2发射
    def sig2Call( self ):

        print('signal-2 emit')
if __name__ == '__main__':
    signal=SignalClass()

运行结果显示如下
这里写图片描述

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jia666666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值