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


Posted in Python onMarch 06, 2020

装饰器信号与槽

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

@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信号与槽的知识请查看下面的相关链接

Python 相关文章推荐
python机器学习之神经网络(二)
Dec 20 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
解决pycharm界面不能显示中文的问题
May 23 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
Apr 29 Python
Django中Middleware中的函数详解
Jul 18 Python
python打印n位数“水仙花数”(实例代码)
Dec 25 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
opencv python如何实现图像二值化
Feb 03 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
Python 正则模块详情
Nov 02 Python
Python 视频画质增强
Apr 28 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
Mar 06 #Python
python实现QQ邮箱发送邮件
Mar 06 #Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 #Python
关于Python字符串显示u...的解决方式
Mar 06 #Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
Mar 06 #Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 #Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 #Python
You might like
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
php策略模式简单示例分析【区别于工厂模式】
2019/09/25 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
详解webpack介绍&安装&常用命令
2017/06/29 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python实现的rsa加密算法详解
2018/01/24 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
python实现简单井字棋小游戏
2020/03/05 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
同事吵架检讨书
2014/02/05 职场文书
创业大赛策划书
2014/03/01 职场文书
保护环境的建议书
2014/03/12 职场文书
团队拓展活动总结
2014/08/27 职场文书
简易版租房协议书范本
2014/10/13 职场文书
电话营销开场白
2015/05/29 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
pandas求平均数和中位数的方法实例
2021/08/04 Python