Pyqt5信号与槽知识详解

  发布日期:   2017-09-04
  最新修改:   2020-01-20
  阅读次数:   147 次

一、前言:

  • 不管在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就可以发出信号了。
  • 是不是很简单呢?
  • 其实有些知识看似很复杂,一旦入门了,后面再学就很容易了。
  • 希望本篇文章能帮助到你,谢谢。

   转载规则

《Pyqt5信号与槽知识详解字》GajAngels 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。