[TOC]

概念


所有继承Qwidget的控件都支持信号与槽机制

  • 信号:当一个信号发生改变时,向外界发出的信息。

当一个信号被发射时,与其关联的槽函数被立刻执行。其中该对象只负责发送信号,发射该信号的对象并不知道是哪个对象在接受这个信号,这样保证了对象与对象之间的低耦合。

如果存在信号和多个槽函数相关联的时候,当信号被发射时,这些槽的执行顺序将会是随机的。

  • 槽:一个执行某些操作的函数或者方法

当和槽连接的信号被发射时,槽会被调用。一个槽并不知道是否有任何信号与自己相连接。

  • 信号与槽机制

  • 将信号 连接 槽,当信号发出时,连接的槽函数会自动执行

  • 信号连接

通过调用QObject对象的connect函数来将某个对象的信号与另一个对象的槽函数相关联。

1
object.信号.connect(槽函数)

当信号与槽没有必要保持关联时,可以使用disconnect函数来断开连接。

1
disconnect(槽函数)

槽函数的特点

  1. 一个信号可以连接多个槽:调用随机
  2. 多个信号可以连接到同一个槽
  3. 信号的参数可以是任何的python类型,如list等
  4. 信号和槽的连接可以被移除
  5. 信号可以和另外一个信号进行关联:第一个信号发出后,第二个信号也同时发送。比如关闭系统的信号发出后,同时会发出保存数据的信号

自定义信号与槽


1
2
3
4
5
6
7
8
9
10
11
12
13
14
from PyQt5.QtCore import pyqtSignal

# 定义信号:可以带参数
signal = pyqtSignal()

# 定义槽函数
def signalCall(self):
  print("signal emit")
 
# 连接
self.signal.connect(self.signalCall)

# 发射信号
self.signal.emit()

关于连接中槽函数无法传递参数问题


1
2
3
4
5
6
7
8
9
10
self.btn.clicked.connect(self.onButtonClick)

# onButtonClick()函数无法传递参数

# 解决办法1:lamdba表达式,传递一个匿名函数
self.btn.clicked.connect(lamdba: self.onButtonClick(1))

#解决办法2:使用functools中的partial函数
self.btn.clicked.connect(partial(self.onButtonClick,1))