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设置socket代理的方法
Jan 14 Python
python根据出生日期获得年龄的方法
Mar 31 Python
Python六大开源框架对比
Oct 19 Python
Python下的常用下载安装工具pip的安装方法
Nov 13 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
Sep 30 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
python加载自定义词典实例
Dec 06 Python
Pycharm的Available Packages为空的解决方法
Sep 18 Python
几款好用的python工具库(小结)
Oct 20 Python
python利用while求100内的整数和方式
Nov 07 Python
python神经网络ResNet50模型
May 06 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 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 裁剪图片成固定大小代码方法
2009/09/09 PHP
PHP开发过程中常用函数收藏
2009/12/14 PHP
php无序树实现方法
2015/07/28 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
JQuery 操作/获取table具体代码
2013/06/13 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
js实现简单的秒表
2020/01/16 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python Matplotlib库入门指南
2015/05/18 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
pandas的qcut()方法详解
2019/07/06 Python
Python占用的内存优化教程
2019/07/28 Python
python下载库的步骤方法
2019/10/12 Python
使用Django清空数据库并重新生成
2020/04/03 Python
python 调用Google翻译接口的方法
2020/12/09 Python
计算机专业自我鉴定
2013/10/15 职场文书
绿色小区申报材料
2014/08/22 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
见习报告的格式
2014/11/04 职场文书
车队安全员岗位职责
2015/02/15 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
廉政党课工作报告案例
2019/06/21 职场文书