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开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
python代码过长的换行方法
Jul 19 Python
python内存动态分配过程详解
Jul 15 Python
python实现文件的分割与合并
Aug 29 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
Django认证系统user对象实现过程解析
Mar 02 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 Python
python 实现图片特效处理
Apr 03 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
百度地图API使用方法详解
2015/08/25 PHP
joomla数据库操作示例代码
2016/01/06 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
JavaScript 指导方针
2007/04/05 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
探索node之事件循环的实现
2020/10/30 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
解决python中无法自动补全代码的问题
2018/12/04 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
Python的pygame安装教程详解
2020/02/10 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
幼儿园秋游活动方案
2014/01/21 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
干部考察材料范文
2014/12/24 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
Mysql 一主多从的部署
2022/05/20 MySQL
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技