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 文件和输入输出小结
Oct 09 Python
Python实现将n个点均匀地分布在球面上的方法
Mar 12 Python
CentOS 7下安装Python3.6 及遇到的问题小结
Nov 08 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
Dec 28 Python
python实现控制台打印的方法
Jan 12 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
基于python实现从尾到头打印链表
Nov 02 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
Python StringIO如何在内存中读写str
Jan 07 Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
Python打印不合法的文件名
Jul 31 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的ZipArchive类用法实例
2014/10/20 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
利用python批量给云主机配置安全组的方法教程
2017/06/21 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
python实现浪漫的烟花秀
2019/01/30 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
奥巴马开学演讲稿
2014/05/15 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
Vue vee-validate插件的简单使用
2021/06/22 Vue.js
Java spring定时任务详解
2021/10/05 Java/Android
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python