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中的条件判断语句
May 14 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
PyQt5每天必学之拖放事件
Aug 27 Python
python SMTP实现发送带附件电子邮件
May 22 Python
Python中return self的用法详解
Jul 27 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
May 24 Python
Python的历史与优缺点整理
May 26 Python
Python collections模块的使用方法
Oct 09 Python
django中cookiecutter的使用教程
Dec 03 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
Dec 27 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
生成缩略图
2006/10/09 PHP
基于Zend的Captcha机制的应用
2013/05/02 PHP
在WordPress的文章编辑器中设置默认内容的方法
2015/12/29 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
Python列表计数及插入实例
2014/12/17 Python
python基于socket实现网络广播的方法
2015/04/29 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
python 实现倒排索引的方法
2018/12/25 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
信访工作经验交流材料
2014/05/23 职场文书
政府四风问题整改措施
2014/10/04 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
Python实现自动玩连连看的脚本分享
2022/04/04 Python