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 09 Python
Python设计模式之抽象工厂模式
Aug 25 Python
python3调用百度翻译API实现实时翻译
Aug 16 Python
Python实现Singleton模式的方式详解
Aug 08 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
关于初始种子自动选取的区域生长实例(python+opencv)
Jan 16 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
Python基础教程之输入输出和运算符
Jul 26 Python
Selenium之模拟登录铁路12306的示例代码
Jul 31 Python
详解numpy1.19.4与python3.9版本冲突解决
Dec 15 Python
python游戏开发之pygame实现接球小游戏
Apr 22 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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 使用curl提交json格式数据
2013/06/29 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
对联广告js flash激活
2006/10/19 Javascript
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
Vue数据驱动模拟实现1
2017/01/11 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
vue 中url 链接左边的小图标更改问题
2019/12/30 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
python获取list下标及其值的简单方法
2016/09/12 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
python对csv文件追加写入列的方法
2019/08/01 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
进修护士自我鉴定
2013/10/14 职场文书
网络信息安全承诺书
2014/03/26 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
检讨书格式
2015/05/07 职场文书
小学生暑假生活总结
2015/07/13 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript