python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例


Posted in Python onMarch 06, 2020

信号与槽有三种使用方法

第一种:内置信号与槽的使用

第二种:自定义信号与槽的使用

第三种:装饰器的信号与槽的使用

一: 内置信号与槽的使用

内置信号与槽的使用,是指在发射信号时,使用窗口控件的函数,而不是自定义的函数,这种也是我们前面用的最多的,下面简单的一个实例,大家就会明白

import sys
from PyQt5.QtWidgets import QMessageBox,QPushButton,QApplication,QWidget
app=QApplication(sys.argv)
widget=QWidget()
def showMsg():
 QMessageBox.information(widget,'信息提示框','Ok 弹出测试信息')
btn=QPushButton('测试点击按钮',widget)
btn.clicked.connect(showMsg)
widget.show()
sys.exit(app.exec_())

运行脚本,显示效果如下

python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例

这个例子将一个按钮对象的内置clicked信号与自定义槽函数showMsg()连接,单击按钮,就会触发这个槽函数,弹出一个信息提示框

二:自定义信号与槽的使用

自定义信号与槽的使用,是指在发射信号时,不使用窗口控件的函数,而是使用自定义的函数,(简单的说就是使用oyqtsSignal类实例发射信号),之所以要使用自定义的信号与槽,是因为通过内置函数发射信号有自身的缺陷,首先,内置函数只包含一些常用地信号,有些信号发射找不到对应的内置函数,其次在特定的情况下,才能发射此信号,如按钮的点击事件,最后,内置函数传递的参数是特定的,不可以自定义,使用自定义的信号与槽函数则没有这些缺陷

在pyqt5中,自定义信号与槽的适用很灵活,比如因为业务需要,在程序中的某些地方需要发射一个信号,传递多种数据,然后在槽函数接受这些数据,这样就可以很灵活的实现一些业务逻辑

简单的一个实例:简单的自定义信号与槽

from PyQt5.QtCore import QObject,pyqtSignal
#信号对象
class QTypeSignal(QObject):
 #定义一个信号
 # sendmsg = pyqtSignal(object)
 #todo 优化 多个参数传递
 sendmsg=pyqtSignal(str,str)
 def __init__(self):
 super(QTypeSignal, self).__init__()
 def run( self ):
 #发射信号
 #self.sendmsg.emit('hell')
 #todo 优化 发射多个参数
 self.sendmsg.emit('第一参数','第二个参数')
#槽对象
class QTypeSlot(QObject):
 def __init__(self):
 super(QTypeSlot, self).__init__()
 #槽对象中的槽函数
 # def get( self,msg ):
 # print("QSlot get msg => " + msg)
 #todo 优化 多个参数
 def get( self,msg1,msg2 ):
 print("QSlot get msg => " + msg1+' '+msg2)
if __name__ == '__main__':
 #实例化信号对象
 send=QTypeSignal()
 #实例化槽对象
 slot=QTypeSlot()
 #1
 print('_____-把信号绑定到槽函数上_____')
 send.sendmsg.connect(slot.get)
 send.run()
 print('_____-把信号与槽函数解绑_____')
 send.sendmsg.disconnect(slot.get)
 send.run()

python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例

信号与槽连接的主要步骤如下

第一步:生成一个信号

    #定义一个信号

    # sendmsg = pyqtSignal(object)

    #todo 优化 多个参数传递

    sendmsg=pyqtSignal(str,str)

第二步:将信号与槽函数连接起来

print('_____-把信号绑定到槽函数上_____')

    send.sendmsg.connect(slot.get)

第三步:槽函数接受数据

 def get( self,msg1,msg2 ):

        print("QSlot get msg => " + msg1+' '+msg2)

第四步:发射信号的实现

 self.sendmsg.emit('第一参数','第二个参数')

第五步:将信号绑定到槽对象中的槽函数上,所以槽函数能收到所发射的信号,自此,数据传递成功,就是这么简单,如果需要传递多个数据,可以自定义参数类型与数目

    send=QTypeSignal()

    slot=QTypeSlot()

    #

    print('_____-把信号绑定到槽函数上_____')

    send.sendmsg.connect(slot.get)

三:使用装饰器信号与槽

1、使用格式

@PyQt5.QtCore.pyqtSlot(参数)
def on_发送者对象名称_发射信号名称(self,参数):
 pass

2、注意点,使用装饰器必须定义两个东西

QMetaObject.connectSlotsByName(self)

给需要绑定事件的定义一个id(self.btn.setObjectName('名称'))

3、按钮的普通事件

...
class Window(QWidget):
 def __init__(self, *args, **kwargs):
 super().__init__(*args, **kwargs)
 self.setWindowTitle('装饰器信号与槽')
 self.resize(500, 500)
 self.move(400, 200)
 self.btn = QPushButton('按钮', self)
 self.init_ui()
 
 def init_ui(self):
 self.btn.clicked.connect(self.btn_hand)
 
 @staticmethod
 def btn_hand():
 print('使用connect点击了按钮')
...

4、使用装饰器后的事件

...
class Window(QWidget):
 def __init__(self, *args, **kwargs):
 super().__init__(*args, **kwargs)
 self.setWindowTitle('装饰器信号与槽')
 self.resize(500, 500)
 self.move(400, 200)
 self.btn = QPushButton('按钮', self)
 self.init_ui()
 # 要在加载组件后使用
 QMetaObject.connectSlotsByName(self)
 
 def init_ui(self):
 # 这个地方定义的名字直接在下面使用
 self.btn.setObjectName('btn')
 
 @pyqtSlot()
 def on_btn_clicked(self):
 print('使用装饰器点击了按钮')

本文主要讲解了PyQt5信号与槽基础使用方法与实例,更多关于PyQt5信号与槽的知识请查看下面的相关链接

Python 相关文章推荐
Python读写配置文件的方法
Jun 03 Python
深入解析Python中的变量和赋值运算符
Oct 12 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
python实现基于SVM手写数字识别功能
May 27 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 Python
Django用户认证系统 User对象解析
Aug 02 Python
python基于celery实现异步任务周期任务定时任务
Dec 30 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
python中的getter与setter你了解吗
Mar 24 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
Python使用ElementTree美化XML格式的操作
Mar 06 #Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 #Python
Python 批量读取文件中指定字符的实现
Mar 06 #Python
You might like
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
extjs form textfield的隐藏方法
2008/12/29 Javascript
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
jquery 插件学习(四)
2012/08/06 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
js获取 type=radio 值的方法
2014/05/09 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
公司企业表扬信
2014/01/11 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
繁星春水读书笔记
2015/06/30 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
2016年公司新年寄语
2015/08/17 职场文书
如何写好活动总结
2019/06/21 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers