首页 > Python资料 博客日记
【python】PyQt5信号与槽原理剖析与应用实战
2024-07-02 01:00:04Python资料围观198次
✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战
景天的主页:景天科技苑
文章目录
PyQt5信号与槽
信号与槽介绍
信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。PyQt的窗口控件类有很多内置信号,开发者也可以添加自定义信号。信号与槽有如下特点:
一个信号可以连接多个槽。
一个信号可以连接另一个信号。
信号参数可以使任何Python类型。
一个槽可以连接到多个信号。
信号与槽的连接方式可以是同步连接,也可以是异步连接。
信号与槽的连接可能会跨线程。
信号可以断开连接。
信号与槽机制解读
信号处理API与应用场景
PyQt5内置的一些信号
destroyed信号
当监听到对象销毁时触发槽函数
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信号
当监听到对象名发生了改变时触发
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。
我们发现,第二次信号没有触发槽的执行
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
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(信号)
查看信号连接槽的数量
print("信号连接槽的数量",self.obj.receivers(self.obj.objectNameChanged))
信号处理综合案例
- 当用户点击按钮的时候, 打印"点我嘎哈?"
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_())
运行
- 在所有修改的窗口标题前, 添加前缀"景天-"
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_())
运行
多次修改,也可以
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python pyinstaller打包exe最完整教程