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爬虫实战之爬取京东商城实例教程
Apr 24 Python
遗传算法之Python实现代码
Oct 10 Python
python+opencv实现动态物体识别
Jan 09 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
Python程序慢的重要原因
Sep 04 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
用Python实现屏幕截图详解
Jan 22 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
php实现微信公众号无限群发
2015/10/11 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
微信支付开发维权通知实例
2016/07/12 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
jQuery find和children方法使用
2011/01/31 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
js实现文本框中焦点在最后位置
2014/03/04 Javascript
javascript如何使用bind指定接收者
2014/05/04 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
详解webpack分离css单独打包
2017/06/21 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
python查询sqlite数据表的方法
2015/05/08 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
使用Python构造hive insert语句说明
2020/06/06 Python
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
搬家公司的创业计划书
2014/01/01 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
党员反邪教心得体会
2016/01/15 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
Python torch.flatten()函数案例详解
2021/08/30 Python