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 相关文章推荐
Python3基础之输入和输出实例分析
Aug 18 Python
Python实现远程调用MetaSploit的方法
Aug 22 Python
python制作一个桌面便签软件
Aug 09 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
Python使用matplotlib绘制余弦的散点图示例
Mar 14 Python
python 判断字符串中是否含有汉字或非汉字的实例
Jul 15 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
Python3 合并二叉树的实现
Sep 30 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
Python之字典添加元素的几种方法
Sep 30 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
基于header的一些常用指令详解
2013/06/06 PHP
理解PHP中的stdClass类
2014/04/18 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
JQuery魔力之$("tagName")与selector
2012/03/05 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
Python socket 套接字实现通信详解
2019/08/27 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
django-csrf使用和禁用方式
2020/03/13 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
python基于pexpect库自动获取日志信息
2021/02/01 Python
英文留学推荐信范文
2014/01/25 职场文书
技术经济专业求职信
2014/09/03 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
2015感人爱情寄语
2015/02/26 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang