PyQt入门(2)-信号和槽
信号和槽用于对象之间的通信。
信号和槽机制是 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)-信号和槽相关推荐
- Qt图形界面编程入门(信号和槽通信机制)
信号和槽机制是Qt的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信. 声明了信号的对象,当其状态改变时,信号就由该对象发送出去,而且该对象只负责发送信号,它不知道另一端是谁在接 ...
- Python Qt GUI设计:信号与槽的使用方法(基础篇—7)
目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...
- pyqt 槽任意参数_PyQt5信号与槽机制入门(一)
信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制.当事件或者状态发生改变时,就会发出信号,信号会触发所有与这个事件(信号)相关的函数(槽):一个信号可 ...
- pyqt5菜鸟教程_[ PyQt入门教程 ] PyQt5信号与槽
信号和槽是PyQt编程对象之间进行通信的机制.每个继承自QWideget的控件都支持信号与槽机制.信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理).本文主要讲述信号和槽最基本.最经 ...
- Python GUI界面编程初步 05- GUI框架PyQt的运用 - 02 PyQt的信号和槽例子
前言:本节讨论PyQt的事件event和信号signal的应用: 事件和信号是GUI和应用交互的两个重要的概念. 其中,事件用来驱动,信号和槽用来动态链接,这两个东西合并起来适用于各种组合的GUI的触 ...
- qwidget show 是否有信号_PyQt5信号与槽机制入门(一)
信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制.当事件或者状态发生改变时,就会发出信号,信号会触发所有与这个事件(信号)相关的函数(槽):一个信号可 ...
- 最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_)
最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_) 一.08.qt中的坐标系 二,09 信号和槽-点击按钮关闭窗口_ 来自 一.08.qt中的坐标系 二,09 信号 ...
- 思路较为简单的pyqt的ui调用和信号与槽的初级例程
刚刚开始学,只会一些简单语法,稍微复杂就看不懂,做不来了.本次的目的是熟悉一下在不转换py和尽量少的代码下直接调用pyqt生成的ui,以及各个ui之间的信号与槽的传递. 1.qt designer里新 ...
- Qt入门(3)——信号和槽
信号和槽用于对象间的通讯.信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分. 在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件.更一般地,我们希 ...
最新文章
- java数列求和_java中关于数列求和的计算方法
- UCOS在LPC上的移植
- oracle 换行符_python实现自动化报表(Oracle/plsql/Excel/多线程)
- C#中使用指针转换数据类型[C#/unsafe]
- vue lang_推荐一个基于Vue 的 H5 快速开发模板
- 浅谈SDN中的OverLay与UnderLay技术
- java 1.8环境变量_java1.8安装及环境变量配置教程
- 深圳先进院研究生计算机专业,2020年中科院深圳先进技术研究院全日制硕士研究生统考专业说明...
- DOS命令大全(经典收藏)【运行CMD后的命令】
- 在win7物理机,使用vmware,3台centos7系统,分别部署httpd,php-fpm,mariadb
- T(n) = 25T(n/5)+n^2的时间复杂度?
- QR分解-givens旋转与Householder变换
- Word 2016插入公式快捷键
- 如何用电路实现检测过零点?这个简单电路就能搞定
- 线上服务应急攻关方法论
- 【gev】 Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
- 谈谈我的人才网站的的发展历程
- IPsec中IKE与ISAKMP过程分析(快速模式-消息2)
- 新视野大学英语第三版读写教程(四)Unite 4 Midterm test answer
- Google英文SEO优化更注重实效性