找回密码
 会员注册
查看: 31|回复: 0

pythonPyQt5信号与槽原理剖析与应用实战

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
69864
发表于 2024-9-5 10:52:47 | 显示全部楼层 |阅读模式
✨✨欢迎大家来到景天科技苑✨✨🎈🎈养成好习惯,先赞后看哦~🎈🎈🏆作者简介:景天科技苑🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战景天的主页:景天科技苑文章目录PyQt5信号与槽信号与槽介绍信号与槽机制解读信号处理API与应用场景destroyed信号objectNameChanged信号disconnect信号widget.blockSignals(bool)widget.signalsBlocked()widget.receivers(信号)信号处理综合案例PyQt5信号与槽信号与槽介绍信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。PyQt的窗口控件类有很多内置信号,开发者也可以添加自定义信号。信号与槽有如下特点:一个信号可以连接多个槽。一个信号可以连接另一个信号。信号参数可以使任何Python类型。一个槽可以连接到多个信号。信号与槽的连接方式可以是同步连接,也可以是异步连接。信号与槽的连接可能会跨线程。信号可以断开连接。信号与槽机制解读信号处理API与应用场景PyQt5内置的一些信号destroyed信号当监听到对象销毁时触发槽函数fromPyQt5.Qtimport*classWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle("QObject的学习")self.resize(500,500)self.setup_ui()defsetup_ui(self):self.QObject信号的操作()defQObject信号的操作(self):self.obj=QObject()#obj.destroyed#obj.objectNameChanged#槽函数的参数用来接收对象,用来表明哪个对象被释放了defdestroy_cao(obj):print("对象被释放了",obj)#内置信号destroyed,释放信号self.obj.destroyed.connect(destroy_cao)delself.objif__name__=='__main__':importsysapp=QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())12345678910111213141516171819202122232425262728293031323334353637运行objectNameChanged信号当监听到对象名发生了改变时触发defQObject信号的操作(self):self.obj=QObject()#槽函数可以接收参数,此时的参数是改变后的ObjectNamedefobj_name_cao(name):print("对象名称发生了改变",name)defobj_name_cao2(name):print("对象名称发生了改变2",name)self.obj.objectNameChanged.connect(obj_name_cao)self.obj.objectNameChanged.connect(obj_name_cao2)#改变ObjectNameself.obj.setObjectName("xxx")1234567891011121314151617运行,两个槽函数都被触发disconnect信号取消链接信号与槽当我们设置了两次objectname改变,槽函数会执行两次在第二次改变之前,我们使用disconnect。我们发现,第二次信号没有触发槽的执行defQObject信号的操作(self):self.obj=QObject()#槽函数可以接收参数,此时的参数是改变后的ObjectNamedefobj_name_cao(name):print("对象名称发生了改变",name)defobj_name_cao2(name):print("对象名称发生了改变2",name)self.obj.objectNameChanged.connect(obj_name_cao)self.obj.objectNameChanged.connect(obj_name_cao2)#改变ObjectName#当我们设置了两次objectname改变,槽函数会执行两次self.obj.setObjectName("xxx")#当我们使用disconnect,取消了信号与槽的连接,ObjectName发生快乐改变,也不会触发槽函数的执行self.obj.objectNameChanged.disconnect()self.obj.setObjectName("xxoo")123456789101112131415161718192021widget.blockSignals(bool)通过传递的布尔参数,可以临时(阻断/恢复)指定控件所有的信号与槽的连接传递True,表示临时阻断信号与槽的连接传递False,表示临时恢复信号与槽的连接defQObject信号的操作(self):self.obj=QObject()#槽函数可以接收参数,此时的参数是改变后的ObjectNamedefobj_name_cao(name):print("对象名称发生了改变",name)defobj_name_cao2(name):print("对象名称发生了改变2",name)self.obj.objectNameChanged.connect(obj_name_cao)self.obj.objectNameChanged.connect(obj_name_cao2)#改变ObjectName#当我们设置了两次objectname改变,槽函数会执行两次self.obj.setObjectName("xxx")#当我们使用disconnect,取消了信号与槽的连接,ObjectName发生快乐改变,也不会触发槽函数的执行#self.obj.objectNameChanged.disconnect()#通过blockSignals(True)阻断信号与槽连接,下面的信号未触发槽函数执行self.obj.blockSignals(True)self.obj.setObjectName("xxoo")123456789101112131415161718192021222324信号被阻断后,第二个槽函数未执行obj.blockSignals(False)继续保持信号与槽的连接widget.signalsBlocked()获取信号是否被阻止,被阻止返回True,没被组织返回FalsedefQObject信号的操作(self):self.obj=QObject()#槽函数可以接收参数,此时的参数是改变后的ObjectNamedefobj_name_cao(name):print("对象名称发生了改变",name)defobj_name_cao2(name):print("对象名称发生了改变2",name)self.obj.objectNameChanged.connect(obj_name_cao)self.obj.objectNameChanged.connect(obj_name_cao2)#改变ObjectName#当我们设置了两次objectname改变,槽函数会执行两次self.obj.setObjectName("xxx")#当我们使用disconnect,取消了信号与槽的连接,ObjectName发生快乐改变,也不会触发槽函数的执行#self.obj.objectNameChanged.disconnect()#通过blockSignals(True)阻断信号与槽连接,下面的信号未触发槽函数执行self.obj.blockSignals(True)#获取信号是否被阻止print("信号是否被阻止",self.obj.signalsBlocked())#继续保持信号与槽的连接#self.obj.blockSignals(False)self.obj.setObjectName("xxoo")1234567891011121314151617181920212223242526272829widget.receivers(信号)查看信号连接槽的数量print("信号连接槽的数量",self.obj.receivers(self.obj.objectNameChanged))1信号处理综合案例当用户点击按钮的时候,打印"点我嘎哈?"fromPyQt5.Qtimport*classWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle("QObject的学习")self.resize(500,500)self.setup_ui()defsetup_ui(self):self.QObject信号的操作()defQObject信号的操作(self):#*************信号与槽案例***************开始btn=QPushButton(self)btn.setText("点击我")defcao():print("点我嘎哈?")btn.clicked.connect(cao)#*************信号与槽案例***************结束if__name__=='__main__':importsysapp=QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233343536运行在所有修改的窗口前,添加前缀"景天-"def信号与槽():#连接窗口变化的信号与槽#通过传递参数获取修改后的defcao(title):#print("窗口变化了",title)#window.windowTitleChanged.disconnect()#设置信号与槽断开,防止出现递归死循环window.blockSignals(True)window.setWindowTitle("景天-"+title)#恢复信号与槽连接,方便后续再次修改时,能触发槽函数window.blockSignals(False)#window.windowTitleChanged.connect(cao)#变化信号window.windowTitleChanged.connect(cao)window.setWindowTitle("HelloSz")#window.setWindowTitle("HelloSz2")#window.setWindowTitle("HelloSz3")if__name__=='__main__':importsysapp=QApplication(sys.argv)#window=Window()#测试信号与槽案例,重新创建个窗口window=QWidget()信号与槽()window.show()sys.exit(app.exec_())1234567891011121314151617181920212223242526272829303132333435运行多次修改,也可以
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 06:17 , Processed in 0.635963 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表