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实现猜数字游戏(无重复数字)示例分享
Mar 29 Python
Python开发WebService系列教程之REST,web.py,eurasia,Django
Jun 30 Python
python实现telnet客户端的方法
Apr 15 Python
Python记录详细调用堆栈日志的方法
May 05 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
python pandas 时间日期的处理实现
Jul 30 Python
python基于opencv检测程序运行效率
Dec 28 Python
python实现监听键盘
Apr 26 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 Python
python 判断字符串当中是否包含字符(str.contain)
Jun 01 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/06/15 PHP
PHP 地址栏信息的获取代码
2009/01/07 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
javascript模拟命名空间
2015/04/17 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
Python对象转JSON字符串的方法
2016/04/27 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
Python的装饰器使用详解
2017/06/26 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
分居协议书范本
2014/11/03 职场文书
鸡毛信观后感
2015/06/11 职场文书
生日祝酒词大全
2015/08/10 职场文书
AJAX学习笔记
2021/05/18 Javascript
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python