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)相关推荐

  1. Qt之信号signals和槽slots详解

    学习到自定义信号和槽的时候经常编译不过去,前边一篇解决了Q_OBJECT编译的问题,这里详细说明了slots和signals. 1.signals前面不可加public.private和protect ...

  2. PyQt5 信号(Signal)与槽(Slot)

    PyQt5 信号与槽 信号与槽介绍 内置信号与槽的使用 自定义信号与槽的使用 自定义信号和内置槽函数 自定义信号和自定义槽函数 自定义有参信号 使用自定义信号参数 装饰器信号与槽 信号与槽的断开和连接 ...

  3. Python深度学习实战PyQt5信号与槽的连接

    本文讲解信号与槽的连接机制,详细示范各种类型的信号/槽连接的实现方法,这是图形用户界面的核心内容.还将介绍面向对象的程序设计,这是图形用户界面的基本思想 目录 1. 信号与槽(Signals and ...

  4. pyqt 槽任意参数_PyQt5快速入门(二)PyQt5信号槽机制

    PyQt5快速入门(二)PyQt5信号槽机制 一.信号槽机制简介 1.信号槽简介 信号槽是Qt的核心机制,也是PyQt编程中对象进行通信的机制.在Qt中,QObject对象和PyQt中所有继承自QWi ...

  5. python输入数据pyqt5_python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例...

    在pyqt5编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以,一般是添加一个按钮,调用对话框,在对话框中进行参数的选择,关闭对话框将参数返回给主窗口 ...

  6. pyqt5信号与槽连接的生命周期与对象引用的生命周期

    pyqt5信号与槽连接的生命周期与对象引用的生命周期,是一致的.举个例子,如果一个变量引用了一个对象,并连接了一个信号,那么如果引用对象发生变化,则原来的连接在新的对象中就不存在了.直接参考代码 fr ...

  7. PyQt5 中信号signal 与 槽 slot 的相关知识

    博文视点 文章写得太好了 转载学习 感谢 https://blog.csdn.net/broadview2006/article/details/78475842 在Qt中,每一个QObject对象和 ...

  8. pyqt5菜鸟教程_[ PyQt入门教程 ] PyQt5信号与槽

    信号和槽是PyQt编程对象之间进行通信的机制.每个继承自QWideget的控件都支持信号与槽机制.信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理).本文主要讲述信号和槽最基本.最经 ...

  9. [转载]qt信号signal和槽slot机制

    好东西! 原文地址:qt信号signal和槽slot机制作者:fox1987 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注 ...

最新文章

  1. 【转】apache常用配置
  2. 自定义Sharepoint的登陆页面(2)
  3. 连接mongodb,kafka异步处理代码
  4. MySQL中的外键约束
  5. PHP strcasecmp函数
  6. 2018年江苏省计算机小高考,江苏2018年小高考成绩查询系统网站入口:江苏省教育考试院...
  7. Java解析json出现双引号变成转义字符解决办法
  8. 【资源】福利来了!生物学相关常用软件小工具,百度云下载链接持续更新中...
  9. 《自抗扰控制技术》——第一遍阅读
  10. 天天学算法——搜索热词关联(TopK)
  11. 描写火车站场景_优美段落:描写车站的经典美文摘抄
  12. 万字长文:人脸识别综述(学习笔记)
  13. Java Web小课程3——写servlet
  14. 计算KL距离的几个例子
  15. Interledger协议(ILP)
  16. Mac系统下docker容器无法使用--net host共享宿主机端口的解决方案
  17. cPanel创建数据库教程
  18. 【JAVA今法修真】 第五章 练气百日,筑基三年
  19. 《世嘉新人培训教材——游戏开发》踩到的坑2、读取图片文件
  20. dlt645 2007 java源码,DLT645 1997 协议解析

热门文章

  1. 金山快盘开发 (一)
  2. 云之讯——简单的短信验证 PHP版
  3. 2021年最佳可靠SSL证书提供商
  4. 奇瑞汽车用鸿蒙,奇瑞配鸿蒙,是自我放弃还是独辟蹊径?
  5. 什么是智慧酒店?完整的解决方案教你如何做好智慧酒店
  6. 信息学奥赛一本通1272【例9.16】分组背包
  7. 2021-2027年中国领先智能软件行业动态监测及发展前景研究报告
  8. dell设置从ssd启动_戴尔笔记本如何设置从ssd启动系统
  9. Freesurfer并行处理数据parallel
  10. 使用 pandas 对数据进行并行处理