Pyqt5信号与槽知识详解
目录
一、前言:
- 不管在PyQt还是Qt开发中,信号和槽都是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。
- 在我们所熟知的很多 GUI 工具包中,窗口小部件 (widget) 都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在 QT 中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。
- 所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,其不需要知道有没有人接收它发出去的信息。
- 槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不需要了解具体的通信机制。
- 单个的槽可以和很多信号进行连接,同样,单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。
二、知识补充
- 在学习信号与槽相关的知识之前,我们先学习一些相关的名次和逻辑
- 信号与槽通信过程中涉及到:信号(Signal)、槽(slot)、连接(connect)、动作事件(action)、发射(emit)、发送者、接受者。
三、自定义信号与槽
- 有关信号与槽的使用我们就不多说了,在之前的案例说我们已经开始使用,本次我们说说如何自定义信号与槽呢?
- 自定义信号的一般流程如下:
1、定义信号 2、定义槽函数 3、绑定信号和槽 4、发射信号
-
我们再来看一段代码
from PyQt5.QtWidgets import (QWidget, QApplication) from PyQt5.QtCore import (pyqtSignal) import sys class EmitSignal(QWidget): signal_empty = pyqtSignal(name='signal_empty'); signal_one = pyqtSignal(int, name='signal_one'); signal_two = pyqtSignal(int, str, name='signal_two'); def __init__(self): super(EmitSignal, self).__init__() def handle_trigger_empty(self): print('signal_empty be emit'); def handle_trigger_one(self, value): print('signal_one be emit,value is : %d' % value); def handl_trigger_two(self, int_value, str_value): print('signal_two be emit,int_value is %d,str_value is %s' % (int_value, str_value)); def emit_signal_empty(self): self.signal_empty.connect(self.handle_trigger_empty); self.signal_empty.emit(); def emit_signal_one(self, int_value): self.signal_one.connect(self.handle_trigger_one); self.signal_one.emit(int_value); def emit_signal_two(self, int_value, str_value): self.signal_two.connect(self.handl_trigger_two); self.signal_two.emit(int_value, str_value) if __name__ == '__main__': app = QApplication(sys.argv); e = EmitSignal(); e.emit_signal_empty(); e.emit_signal_one(123); e.emit_signal_two(479548645, '安杰小生:欢迎添加群号479548645进行相互学习') sys.exit(app.exec_());
-
运行结果:
signal_empty be emit signal_one be emit,value is : 123 signal_two be emit,int_value is 479548645,str_value is 安杰小生:欢迎添加群号479548645进行相互学习
代码解析:
- 易错点:定义的信号成员一定要在类执行init方法之前声明,否则会报错的哦,具体原因这里就不再深入,感兴趣的同学可以给我留言,一起讨论。
- 如:signal_empty = pyqtSignal(name=‘signal_empty’); 定义一个无参数的信号、名字为signal_empty。
- 然后我们声音一个槽函数,handle_trigger_empty,声明好之后调用connect进行连接,然后信号执行emit就可以发出信号了。
- 是不是很简单呢?
- 其实有些知识看似很复杂,一旦入门了,后面再学就很容易了。
- 希望本篇文章能帮助到你,谢谢。