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 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
python获取当前时间对应unix时间戳的方法
May 15 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
对Python函数设计规范详解
Jul 19 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
python打包成so文件过程解析
Sep 28 Python
Python交互环境下打印和输入函数的实例内容
Feb 16 Python
python计算导数并绘图的实例
Feb 29 Python
Django使用Profile扩展User模块方式
May 14 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 Python
python os.rename实例用法详解
Dec 06 Python
使用python向MongoDB插入时间字段的操作
May 18 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
使用 php4 加速 web 传输
2006/10/09 PHP
PHP字符串的编码问题的详细介绍
2013/04/27 PHP
smarty中post用法实例
2014/11/28 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
php判断目录存在的简单方法
2019/09/26 PHP
laravel5.6实现数值转换
2019/10/23 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
PHP时间类完整代码实例
2021/02/26 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
js调用css属性写法
2013/09/21 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
js实现图片360度旋转
2017/01/22 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
对Layer UI 模块化的用法详解
2019/09/26 Javascript
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
python高阶爬虫实战分析
2018/07/29 Python
TensorFlow Session会话控制&Variable变量详解
2018/07/30 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
生日宴会答谢词
2014/01/09 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
学徒工职责
2014/03/06 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
学校教师培训工作总结
2015/10/14 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
《牧场之国》教学反思
2016/02/22 职场文书