【python】PyQt5信号与槽原理剖析与应用实战

CSDN 2024-07-03 14:35:01 阅读 86

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑

🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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信号

当监听到对象销毁时触发槽函数

<code>from PyQt5.Qt import *

class Window(QWidget):

def __init__(self):

super().__init__()

self.setWindowTitle("QObject的学习")

self.resize(500, 500)

self.setup_ui()

def setup_ui(self):

self.QObject信号的操作()

def QObject信号的操作(self):

self.obj = QObject()

# obj.destroyed

# obj.objectNameChanged

#槽函数的参数用来接收对象,用来表明哪个对象被释放了

def destroy_cao(obj):

print("对象被释放了", obj)

#内置信号destroyed,释放信号

self.obj.destroyed.connect(destroy_cao)

del self.obj

if __name__ == '__main__':

import sys

app = QApplication(sys.argv)

window = Window()

window.show()

sys.exit(app.exec_())

运行

在这里插入图片描述

objectNameChanged信号

当监听到对象名发生了改变时触发

<code>def QObject信号的操作(self):

self.obj = QObject()

#槽函数可以接收参数,此时的参数是改变后的ObjectName

def obj_name_cao(name):

print("对象名称发生了改变", name)

def obj_name_cao2(name):

print("对象名称发生了改变2", name)

self.obj.objectNameChanged.connect(obj_name_cao)

self.obj.objectNameChanged.connect(obj_name_cao2)

#改变ObjectName

self.obj.setObjectName("xxx")

运行,两个槽函数都被触发

在这里插入图片描述

disconnect信号

取消链接信号与槽

当我们设置了两次objectname改变,槽函数会执行两次

在这里插入图片描述

在第二次改变之前,我们使用disconnect。

我们发现,第二次信号没有触发槽的执行

在这里插入图片描述

<code>def QObject信号的操作(self):

self.obj = QObject()

#槽函数可以接收参数,此时的参数是改变后的ObjectName

def obj_name_cao(name):

print("对象名称发生了改变", name)

def obj_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")

widget.blockSignals(bool)

通过传递的布尔参数,可以临时(阻断/恢复)指定控件所有的信号与槽的连接

传递True,表示临时阻断信号与槽的连接

传递False,表示临时恢复信号与槽的连接

def QObject信号的操作(self):

self.obj = QObject()

#槽函数可以接收参数,此时的参数是改变后的ObjectName

def obj_name_cao(name):

print("对象名称发生了改变", name)

def obj_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")

信号被阻断后,第二个槽函数未执行

在这里插入图片描述

obj.blockSignals(False)

继续保持信号与槽的连接

在这里插入图片描述

widget.signalsBlocked()

获取信号是否被阻止,被阻止返回True,没被组织返回False

<code>def QObject信号的操作(self):

self.obj = QObject()

#槽函数可以接收参数,此时的参数是改变后的ObjectName

def obj_name_cao(name):

print("对象名称发生了改变", name)

def obj_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")

在这里插入图片描述

widget.receivers(信号)

查看信号连接槽的数量

<code>print("信号连接槽的数量",self.obj.receivers(self.obj.objectNameChanged))

在这里插入图片描述

信号处理综合案例

当用户点击按钮的时候, 打印"点我嘎哈?"

<code>from PyQt5.Qt import *

class Window(QWidget):

def __init__(self):

super().__init__()

self.setWindowTitle("QObject的学习")

self.resize(500, 500)

self.setup_ui()

def setup_ui(self):

self.QObject信号的操作()

def QObject信号的操作(self):

# *************信号与槽案例***************开始

btn = QPushButton(self)

btn.setText("点击我")

def cao():

print("点我嘎哈?")

btn.clicked.connect(cao)

# *************信号与槽案例***************结束

if __name__ == '__main__':

import sys

app = QApplication(sys.argv)

window = Window()

window.show()

sys.exit(app.exec_())

运行

在这里插入图片描述

在所有修改的窗口标题前, 添加前缀"景天-"

<code>def 信号与槽():

# 连接窗口标题变化的信号 与 槽

#通过传递参数获取修改后的标题

def cao(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("Hello Sz")

# window.setWindowTitle("Hello Sz2")

# window.setWindowTitle("Hello Sz3")

if __name__ == '__main__':

import sys

app = QApplication(sys.argv)

# window = Window()

#测试信号与槽案例,重新创建个窗口

window = QWidget()

信号与槽()

window.show()

sys.exit(app.exec_())

运行

在这里插入图片描述

多次修改,也可以

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。