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开发之thread线程基础实例入门
Nov 11 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
解决pycharm界面不能显示中文的问题
May 23 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
python删除字符串中指定字符的方法
Aug 13 Python
Python进阶之@property动态属性的实现
Apr 01 Python
Python之Class&Object用法详解
Dec 25 Python
Python urlopen()和urlretrieve()用法解析
Jan 07 Python
python数据爬下来保存的位置
Feb 17 Python
python dict如何定义
Sep 02 Python
Django项目如何正确配置日志(logging)
Apr 29 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 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项目打包方法
2008/02/18 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
php中json_encode中文编码问题分析
2011/09/13 PHP
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
jquery ready()的几种实现方法小结
2010/06/18 Javascript
HTML颜色选择器实现代码
2010/11/23 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
Python实现新浪博客备份的方法
2016/04/27 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
初中女生自我鉴定
2013/12/19 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书