信号和槽用于对象之间的通信。

信号和槽机制是 Qt 的核心特性,可能也是与其他框架最不同的地方。Qt 的元对象系统使信号和槽成为可能。

在 GUI 编程中,当我们更改一个 widget 时,我们通常希望通知另一个 widget。更普遍地说,我们希望任何类型的对象都能够相互通信。例如,如果用户单击关闭按钮,我们可能希望调用窗口的
close()函数。

其他框架使用回调实现这种通信,在 Qt 中,我们有回调技术的替代方法:

我们使用信号和槽,当特定事件发生时会发出信号。Qt 的widget有许多预定义的信号,但我们总是可以将widget子类化以向它们添加我们自己的信号。插槽是响应特定信号而调用的函数。Qt 的widget有许多预定义的插槽,但通常的做法是将widget子类化并添加您自己的插槽,以便您可以处理您感兴趣的信号。

更多详情可以看官网文档:信号和槽

这里简单总结以下核心要点:

1. 信号和槽的使用依赖于QObject上下文,就是说必须在QObject或者其子类中以类成员变量的方式定义信号,其他地方定义的信号是无效的。信号与槽的连接和信号的发射就无所谓了,放在哪里都可以。

from PyQt5.QtCore import QObject, pyqtSignalclass ContextObject(QObject):# 信号只能定义在这里my_signal = pyqtSignal()def my_solt():print('i get the signal.')if __name__ == "__main__":context = ContextObject()# 连接信号和槽context.my_signal.connect(my_solt)# 发射信息context.my_signal.emit()print('over')"""
i get the signal.
over
"""

说明:

必须要实例化ContextObject,在代码中直接以ContextObject.my_signal.connect(my_solt)的方式连接信号和槽是无效的,因为这时没有上下文环境,my_signal还没有添加connect、emit等方法

2. 信号的签名必须与槽的签名相匹配,槽的签名可以比信号的签名短,但不能比它长。使用emit发射信号时,参数的数量和类型必须与定义信号时的严格对应。

from PyQt5.QtCore import QObject, pyqtSignalclass ContextObject(QObject):my_signal = pyqtSignal(str, int)def my_solt1():print('my_solt1')def my_solt2(a):print('my_solt2:', a)def my_solt3(a, b):print('my_solt3:', a, b)def my_solt4(a, b, c):print('my_solt4:', a, b, c)if __name__ == "__main__":context = ContextObject()context.my_signal.connect(my_solt1) # my_solt1context.my_signal.connect(my_solt2) # my_solt2: 2context.my_signal.connect(my_solt3) # my_solt3: 2 3context.my_signal.connect(my_solt4) # TypeError: my_solt4() missing 1 required positional argument: 'c'context.my_signal.emit("2", 3)context.my_signal.emit(2, 3) # TypeError: ContextObject.my_signal[str, int].emit(): argument 1 has unexpected type 'int'print('over')

3. 一个信号可以连接任意多个槽,一个槽可以连接到任意多个信号上

from PyQt5.QtCore import QObject, pyqtSignalclass ContextObject(QObject):my_signal1 = pyqtSignal(str, int)my_signal2 = pyqtSignal(int)def my_solt1():print('my_solt1')def my_solt2(a):print('my_solt2:', a)if __name__ == "__main__":context = ContextObject()context.my_signal1.connect(my_solt1)context.my_signal1.connect(my_solt2)context.my_signal2.connect(my_solt1)context.my_signal2.connect(my_solt2)print('my_signal1')context.my_signal1.emit("2", 3)print('my_signal2')context.my_signal2.emit(5)print('over')"""
my_signal1
my_solt1
my_solt2: 2
my_signal2
my_solt1
my_solt2: 5
over
"""

4. 信号的发射与槽的调用是同步的,即只有所有槽都按顺序挨个调用完成之后,emit()之后的代码才会继续执行

5. 使用lambda表达式给无参数信号携带参数

class ContextQObject(QObject):my_signal = pyqtSignal()def func(num, count):print(num, count)if __name__ == '__main__':my = ContextQObject()a = 222b = 333my.my_signal.connect(lambda : func(a, b))my.my_signal.emit()
输出:222 333

6. 使用functools下的partial给无参数信号携带参数

class ContextQObject(QObject):my_signal = pyqtSignal()def func(num, count):print(num, count)if __name__ == '__main__':my = ContextQObject()a = 222b = 333my.my_signal.connect(partial(func, a, b))my.my_signal.emit()
输出:222 333

第5条和第6条一般用来扩展PyQt5的内置信号,因为很多内置信号都是未定义参数的,但有时候我们又有传输参数的需求。

PyQt入门(2)-信号和槽相关推荐

  1. Qt图形界面编程入门(信号和槽通信机制)

    信号和槽机制是Qt的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信. 声明了信号的对象,当其状态改变时,信号就由该对象发送出去,而且该对象只负责发送信号,它不知道另一端是谁在接 ...

  2. Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

    目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...

  3. pyqt 槽任意参数_PyQt5信号与槽机制入门(一)

    信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制.当事件或者状态发生改变时,就会发出信号,信号会触发所有与这个事件(信号)相关的函数(槽):一个信号可 ...

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

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

  5. Python GUI界面编程初步 05- GUI框架PyQt的运用 - 02 PyQt的信号和槽例子

    前言:本节讨论PyQt的事件event和信号signal的应用: 事件和信号是GUI和应用交互的两个重要的概念. 其中,事件用来驱动,信号和槽用来动态链接,这两个东西合并起来适用于各种组合的GUI的触 ...

  6. qwidget show 是否有信号_PyQt5信号与槽机制入门(一)

    信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制.当事件或者状态发生改变时,就会发出信号,信号会触发所有与这个事件(信号)相关的函数(槽):一个信号可 ...

  7. 最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_)

    最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_) 一.08.qt中的坐标系 二,09 信号和槽-点击按钮关闭窗口_ 来自 一.08.qt中的坐标系 二,09 信号 ...

  8. 思路较为简单的pyqt的ui调用和信号与槽的初级例程

    刚刚开始学,只会一些简单语法,稍微复杂就看不懂,做不来了.本次的目的是熟悉一下在不转换py和尽量少的代码下直接调用pyqt生成的ui,以及各个ui之间的信号与槽的传递. 1.qt designer里新 ...

  9. Qt入门(3)——信号和槽

    信号和槽用于对象间的通讯.信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分. 在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件.更一般地,我们希 ...

最新文章

  1. java数列求和_java中关于数列求和的计算方法
  2. UCOS在LPC上的移植
  3. oracle 换行符_python实现自动化报表(Oracle/plsql/Excel/多线程)
  4. C#中使用指针转换数据类型[C#/unsafe]
  5. vue lang_推荐一个基于Vue 的 H5 快速开发模板
  6. 浅谈SDN中的OverLay与UnderLay技术
  7. java 1.8环境变量_java1.8安装及环境变量配置教程
  8. 深圳先进院研究生计算机专业,2020年中科院深圳先进技术研究院全日制硕士研究生统考专业说明...
  9. DOS命令大全(经典收藏)【运行CMD后的命令】
  10. 在win7物理机,使用vmware,3台centos7系统,分别部署httpd,php-fpm,mariadb
  11. T(n) = 25T(n/5)+n^2的时间复杂度?
  12. QR分解-givens旋转与Householder变换
  13. Word 2016插入公式快捷键
  14. 如何用电路实现检测过零点?这个简单电路就能搞定
  15. 线上服务应急攻关方法论
  16. 【gev】 Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
  17. 谈谈我的人才网站的的发展历程
  18. IPsec中IKE与ISAKMP过程分析(快速模式-消息2)
  19. 新视野大学英语第三版读写教程(四)Unite 4 Midterm test answer
  20. Google英文SEO优化更注重实效性

热门文章

  1. 首台纯电动跑车Battista将全球首发,加速性能超过F1赛车
  2. 从Word生成有“导航窗格”的PDF(举例说明)
  3. 网页前端第二次培训作业
  4. ArrayDeque
  5. 你们要的圣诞帽~ Python实现
  6. PCIe Capabilities List
  7. 如何为你的 Windows 应用程序关联 URL 协议,以便在浏览器中也能打开你的应用
  8. qq for ubuntu 10.04总是掉线
  9. iframe结构的网站按F5刷新子页面的实现方式
  10. python 直方图的绘制方法全解_教你利用Python玩转histogram直方图的五种方法