信号(Signal
)和槽(Slot
)是Qt
编程中对象间通讯的机制,在编写PyQt5
程序时,不可能离得开信号和槽。在Qt
中,每一个QObject
对象,包括PyQt
中所有继承自QWidget
的控件(因为它们都是QObject
的子对象)都支持signal
和slot
机制。
还是以之前的PyQt5
工程为例
self.pushButton.clicked.connect(self.button_clicked)
上面的代码表明当按钮pushButton
(QPushButton
是QWidget
的子类)被点击(释放clicked
信号)时,slot
(方法button_clicked
)会被执行。
PyQt5
允许一个signal
同时绑定多个slot
,如
from PyQt5.QtWidgets import QPushButton
self.pushButton.clicked.connect(self.button_clicked)
self.pushButton.clicked.connect(self.button_clicked_2)
从执行结果上看,slot
执行的顺序是跟绑定的顺序一样的,即先绑先执行。另外对于多个signal
绑定同一slot
的情况,比较容易理解,就不多说
还有种特殊的情况是signal
和signal
的绑定,这里假设还有一个QPushButton pushButton1
,我们让它的clicked
信号和pushButton
的信号clicked
相绑定,如下
from PyQt5.QtWidgets import QPushButton
self.pushButton.clicked.connect(self.button_clicked)
self.pushButton1.clicked.connect(self.pushButton.clicked)
PyQt5
提供了disconnect
方法来进行解绑
from PyQt5.QtWidgets import QPushButton
self.pushButton1.clicked.disconnect(self.pushButton.clicked)
self.pushButton.clicked.disconnect(self.button_click_2)
PyQt5
提供了QtCore.pyqtSignal
函数来产生一个signal
,之后就是熟悉的绑定操作了,看个实例就清楚了
from PyQt5.QtWidgets import QWidget
from PyQt5.QtCore import pyqtSignal
class EmitSignal(QWidget):
def __init__(self):
super(EmitSignal,self).__init__()
self.customSignal = pyqtSignal()
def emitCustomSignal(self):
self.customSignal.emit()
经常需要在某个signal
发送时附带相应的数据,实际上就是传参,然后在slot
方法中接收传递过来的数据,这样就可以非常灵活地实现一些业务逻辑
首先是生成一个signal
transcoding_thread_status = pyqtSignal(object)
然后将signal
和slot
方法绑定
self.transcoding_thread_status.connect(self.slotShowTransThreadStatus)
slot
方法接收数据
def slotShowTransThreadStatus(something):
print(something)
最后来看看,signal emit
时是怎么实现的
self.transcoding_thread_status.emit("Hello")
至此数据就传递成功了,就是这么简单。
以上是传递一个参数,那如果我需要传递2个呢,是不是也可以用上面的方法呢?思路是一样的,细节做一点小修改就好了。
transcoding_thread_status = pyqtSignal(str,str)
如果传递的数据类型是整形的话,就换成int,对应的slot方法也要跟着修改
def slotShowTransThreadStatus(something,anything):
print('something={}, anything={}'.format(something, anything))
发送信号时,就跟上2个参数
self.transcoding_thread_status.emit("Hello","world")
类似的,如果需要传递更多参数,请依葫芦画瓢。
为了便于保存记录,在Github
创建了一个工程,地址是: https://github.com/xugaoxiang/learningPyQt5,后续会把所有的代码、文档以及博文链接都放在上面。