PyQt5快速入门(二)PyQt5信号槽机制
一、信号槽机制简介
1、信号槽简介
信号槽是Qt的核心机制,也是PyQt编程中对象进行通信的机制。在Qt中,QObject对象和PyQt中所有继承自QWidget的控件都支持信号槽机制。当信号发射时,连接的槽函数会自动执行。在PyQt5中,信号与槽函数通过object.signal.connect()方法进行连接。
信号槽特点如下:
(1)一个信号可以连接多个槽
(2)一个信号可以连接另一个信号
(3)信号参数可以是任意Python类型
(4)一个槽可以监听多个信号
(5)信号与槽的连接方式可以是同步连接,也可以是异步连接。
(6)信号与槽的连接可以跨线程
(7)信号可以断开
在编写一个类时,要首先定义的类的信号与槽,在类中信号与槽进行连接,实现对象之间的数据传输。当事件或状态发生变化时,会发出信号,进而触发执行事件或信号关联的槽函数。信号槽机制示意如下:
2、定义信号
PyQt的内置信号是自动定义的,使用PyQt5.QtCore.pyqtSignal函数可以为QObject对象创建一个信号,使用pyqtSignal函数可以把信号定义为类的属性。
class pyqtSignal:
def __init__(self, *types, name: str = ...) -> None: ...
types参数表示定义信号时参数的类型,name参数表示信号的名称,默认使用类的属性名称。
使用pyqtSignal函数创建一个或多个重载的未绑定的信号作为类的属性,信号只能在QObject的子类中定义。信号必须在类创建时定义,不能在类创建后作为类的属性动态添加进来。使用pyqtSignal函数定义信号时,信号可以传递多各参数,并指定信号传递参数的类型,参数类型是标准的Python数据类型,包括字符串、日期、布尔类型、数字、列表、字典、元组。
from PyQt5.QtCore import pyqtSignal, QObject
class StandardItem(QObject):
# 定义信号,信号有两个参数,两个参数的类型分别为str,str,信号名称为dataChanged
data_changed = pyqtSignal(str, str, name="dataChanged")
# 更新信息,发送信号
def update(self):
self.dataChanged.emit("old status", "new status")
3、操作信号
使用connect函数可以将信号绑定到槽函数上,使用disconnect函数可以解除信号与槽函数的绑定,使用emit函数可以发射信号。QObject.signal.connect(self, slot, type=None, no_receiver_check=False)
建立信号到槽函数的连接,type为连接类型。QObject.signal.disconnect(self, slot=None)
断开信号到槽的连接emit(self, *args)
发送信号,args为可变参数。
import sys
from PyQt5.QtCore import pyqtSignal, QObject, QCoreApplication
class StandardItem(QObject):
# 定义信号,信号有两个参数,两个参数的类型分别为str,str,信号名称为dataChanged
data_changed = pyqtSignal(str, str, name="dataChanged")
# 更新信息,发送信号
def update(self):
self.dataChanged.emit("old status", "new status")
# 定义槽函数
def onDataChanged(self, old, new):
print(old)
print(new)
if __name__ == "__main__":
app = QCoreApplication(sys.argv)
item = StandardItem()
item.dataChanged.connect(item.onDataChanged)
item.update()
sys.exit(app.exec_