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写的一个简单DNS服务器实例
Jun 04 Python
Python with的用法
Aug 22 Python
Python中AND、OR的一个使用小技巧
Feb 18 Python
Python实现把xml或xsl转换为html格式
Apr 08 Python
详解python时间模块中的datetime模块
Jan 13 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
python 图像处理画一个正弦函数代码实例
Sep 10 Python
python和php哪个更适合写爬虫
Jun 22 Python
Python3实现建造者模式的示例代码
Jun 28 Python
Python在字符串中处理html和xml的方法
Jul 31 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 20 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新手用的Insert和Update语句构造类
2012/03/31 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
一个实用的php验证码类
2017/07/06 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
tagName的使用,留一笔
2006/06/26 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
JavaScript Timer实现代码
2010/02/17 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
Javascript之String对象详解
2016/06/08 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
浅谈Python中的闭包
2015/07/08 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
使用Python生成XML的方法实例
2017/03/21 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
python为什么要安装到c盘
2020/07/20 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
计算机专业推荐信范文
2013/11/27 职场文书
员工拾金不昧表扬信
2014/01/09 职场文书
手机被没收检讨书
2014/02/22 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
电影开国大典观后感
2015/06/04 职场文书