8. PyQt5信号(signals)和槽(slots)
PyQt5信号signals和槽slots
- 1. 什么是信号(signals)和槽(slots)?
- 2. 信号和槽机制概述
- 3. 创建自定义的信号和槽
- 4. 信号和槽的关联(连接)
1. 什么是信号(signals)和槽(slots)?
信号和槽是用于对象之间的通信的,它们是Qt编程的基础,也是Qt的核心。它们可以让编程人员把那些互不了解的对象绑定在一起,来完成对象之间的协同操作。为此 Qt 引入了一些关键字,他们是slots、 signals、 emit,这些都不是 C++关键字,是 Qt 特有的,这些关键字会被 Qt 的 moc转换为标准的 C++语句。
假如我们单击窗口上的一个按钮后想要弹出一个对话框,那么可以将这个按钮的单击信号和自定义的槽关联起来,在这个槽中创建一个对话框并且显示它。这样,单击这个按钮时就会发射信号,进而执行和它关联的槽函数(处理这个信号)来显示一个对话框。
Qt 的部件类中有一些已经定义好了的信号和槽, 通常的作法是子类化部件类,然后添加自已的信号和槽。
2. 信号和槽机制概述
QT/PyQt 使用的C++/Python语言虽然是面向对象的语言,但程序的具体实现代码仍然是由函数来实现的,因此所谓的对象之间的通信,从程序设计的角度来看,就是函数调用的问题,只不过是某个对象的成员函数调用另一个对象的成员函数而已。
从设计模式的角度来看,信号和槽其实就是观察者模式的一种实现,什么是观察者模式,可以参考GOF的设计模式一书。
Qt使用的信号和槽机制的基本思想如下:
- 创建一个信号,其中创建信号需要遵循一定的规则
- 当需要调用外部函数时,发送一个信号
- 此时与该信号相关联的槽便会被调用,槽其实就是一个函数,当然要是函数成为槽是有一定的规则的。
- 信号和槽的关联是要由程序员来指定的
信号和槽的执行大致过程如下:
定义一个信号:x
定义一个槽函数: void g(...){...} # g和h都是程序员定义的槽
另一个槽函数:void h(...){...}
关联信号和槽:(x, g) // 这一步是有程序员指定的
执行函数f时:
f(...)
{做一些处理...# 信号可以由程序员发射,也可以由系统发射,发射信号就相当于是一个函数调用# 这里相当于调用函数g发送信号: x# 当接收信号的槽函数g执行完其自身的代码后,继续在这里往下运行做另外一些处理...
}
需要注意的是:
- 一个信号可以关联到多个槽上
- 多个信号也可以关联到同一个槽上
- 甚至,一个信号还可以关联到另一个信号上。
- 若信号连接到另一个信号,则当第一个信号发射时,会立即发射第二个信号
- 如果存在多个槽与某个信号关联,那么当这个信号被发射时,这些槽将会一个接一个按顺序执行,执行顺序与关联顺序相同。
Qt在其类库中已经预定义了很多信号和槽,因此在Qt中
- 可以仅使用Qt库中预定义的信号和槽
- 也可以只使用预定义的信号,而使用自定义的槽
- 也可以使用预定义的槽,来响应自定义的信号
- 当然,信号和槽也都可以全部自定义
3. 创建自定义的信号和槽
# coding=utf-8import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QGridLayout
from PyQt5.QtCore import pyqtSignal, Qtclass MyWidget(QWidget):# 申明一个自定义信号,带2个int类型的参数btn_clicked_signal = pyqtSignal(int, int)def __init__(self, parent=None):super().__init__(parent)self.init_ui()def init_ui(self):# 创建一个gridlayout用于网格布局grid = QGridLayout()grid.setSpacing(10)# 创建一个label用于展示当前鼠标的位置坐标x = y = 0self.text = '左键点击窗口, 获取当前鼠标位置坐标 x:{0}, y:{1}'.format(x, y)self.label = QLabel(self.text, self)# 窗口布局grid.addWidget(self.label, 0, 0, Qt.AlignmentFlag.AlignCenter)self.setLayout(grid)# 关联自定义信号和槽self.btn_clicked_signal.connect(self.on_btn_click)# 设置鼠标可追踪self.setMouseTracking(True)# 展示窗口self.resize(200, 100)self.setWindowTitle('自定义信号和槽示例程序')self.show()# 自定义的槽函数, 将获取到的鼠标坐标显示出来def on_btn_click(self, x, y):self.text = '左键点击窗口, 获取当前鼠标位置坐标 x:{0}, y:{1}'.format(x, y)self.label.setText(self.text)# 重写鼠标按下事件def mousePressEvent(self, event):if event.button() == Qt.MouseButton.LeftButton:# 鼠标左键按下时,发射自定义信号self.btn_clicked_signal.emit(event.x(), event.y())if __name__ == '__main__':app = QApplication(sys.argv)my_widget = MyWidget()my_widget.show()sys.exit(app.exec_())
运行效果如下:
4. 信号和槽的关联(连接)
- 使用connect()方法将信号和槽关联起来, 见上述代码示例
self.btn_clicked_signal.connect(self.on_btn_click)
- 使用emit()方法来发射信号,可以携带参数,见上述代码示例
self.btn_clicked_signal.emit(event.x(), event.y())
- 使用disconnect()方法也可以让信号和槽断开关联
8. PyQt5信号(signals)和槽(slots)相关推荐
- Qt之信号signals和槽slots详解
学习到自定义信号和槽的时候经常编译不过去,前边一篇解决了Q_OBJECT编译的问题,这里详细说明了slots和signals. 1.signals前面不可加public.private和protect ...
- PyQt5 信号(Signal)与槽(Slot)
PyQt5 信号与槽 信号与槽介绍 内置信号与槽的使用 自定义信号与槽的使用 自定义信号和内置槽函数 自定义信号和自定义槽函数 自定义有参信号 使用自定义信号参数 装饰器信号与槽 信号与槽的断开和连接 ...
- Python深度学习实战PyQt5信号与槽的连接
本文讲解信号与槽的连接机制,详细示范各种类型的信号/槽连接的实现方法,这是图形用户界面的核心内容.还将介绍面向对象的程序设计,这是图形用户界面的基本思想 目录 1. 信号与槽(Signals and ...
- pyqt 槽任意参数_PyQt5快速入门(二)PyQt5信号槽机制
PyQt5快速入门(二)PyQt5信号槽机制 一.信号槽机制简介 1.信号槽简介 信号槽是Qt的核心机制,也是PyQt编程中对象进行通信的机制.在Qt中,QObject对象和PyQt中所有继承自QWi ...
- python输入数据pyqt5_python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例...
在pyqt5编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以,一般是添加一个按钮,调用对话框,在对话框中进行参数的选择,关闭对话框将参数返回给主窗口 ...
- pyqt5信号与槽连接的生命周期与对象引用的生命周期
pyqt5信号与槽连接的生命周期与对象引用的生命周期,是一致的.举个例子,如果一个变量引用了一个对象,并连接了一个信号,那么如果引用对象发生变化,则原来的连接在新的对象中就不存在了.直接参考代码 fr ...
- PyQt5 中信号signal 与 槽 slot 的相关知识
博文视点 文章写得太好了 转载学习 感谢 https://blog.csdn.net/broadview2006/article/details/78475842 在Qt中,每一个QObject对象和 ...
- pyqt5菜鸟教程_[ PyQt入门教程 ] PyQt5信号与槽
信号和槽是PyQt编程对象之间进行通信的机制.每个继承自QWideget的控件都支持信号与槽机制.信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理).本文主要讲述信号和槽最基本.最经 ...
- [转载]qt信号signal和槽slot机制
好东西! 原文地址:qt信号signal和槽slot机制作者:fox1987 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注 ...
最新文章
- 【转】apache常用配置
- 自定义Sharepoint的登陆页面(2)
- 连接mongodb,kafka异步处理代码
- MySQL中的外键约束
- PHP strcasecmp函数
- 2018年江苏省计算机小高考,江苏2018年小高考成绩查询系统网站入口:江苏省教育考试院...
- Java解析json出现双引号变成转义字符解决办法
- 【资源】福利来了!生物学相关常用软件小工具,百度云下载链接持续更新中...
- 《自抗扰控制技术》——第一遍阅读
- 天天学算法——搜索热词关联(TopK)
- 描写火车站场景_优美段落:描写车站的经典美文摘抄
- 万字长文:人脸识别综述(学习笔记)
- Java Web小课程3——写servlet
- 计算KL距离的几个例子
- Interledger协议(ILP)
- Mac系统下docker容器无法使用--net host共享宿主机端口的解决方案
- cPanel创建数据库教程
- 【JAVA今法修真】 第五章 练气百日,筑基三年
- 《世嘉新人培训教材——游戏开发》踩到的坑2、读取图片文件
- dlt645 2007 java源码,DLT645 1997 协议解析