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中处理XML的教程
Apr 29 Python
Python生成不重复随机值的方法
May 11 Python
Django框架中方法的访问和查找
Jul 15 Python
详解Python中的from..import绝对导入语句
Jun 21 Python
Django rest framework实现分页的示例
May 24 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
Python读取二进制文件代码方法解析
Jun 22 Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 13 Python
Jupyter Notebook安装及使用方法解析
Nov 12 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删除非空目录的函数代码小结
2013/02/28 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
在Express中提供静态文件的实现方法
2019/10/17 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
django从后台返回html代码的实例
2020/03/11 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
经贸日语专业个人求职信范文
2013/12/28 职场文书
警察思想汇报
2014/01/04 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
入党积极分子自我鉴定
2014/02/18 职场文书
分家协议书
2014/04/21 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS