装饰器信号与槽

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

@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按钮,控制台打印预期调试信息

python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例

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()

python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例

本文主要讲解了PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例,更多关于PyQt5信号与槽的知识请查看下面的相关链接

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。