1 信号与槽的基本概念
信号(signal)与槽(slot)是Qt的核心机制,也是进行PyQt5编程时对象之间通信的基础。在PyQt5中,每一个QObject对象(包括各种窗口和控件)都支持信号与槽机制,通过信号与槽的关联,就可以实现对象之间的通信。当信号发射时,连接的槽函数(方法)将会自动执行。在PyQt5中,信号与槽是通过对象的signal.connect()方法进行连接的。
PyQt5的窗口控件中有很多内置的信号,例如,如图所示为MainWindow主窗口的部分内置信号与槽。

PyQt5中使用信号与槽的主要特点如下:
- 一个信号可以连接多个槽。
- 一个槽可以监听多个信号。
- 信号与信号之间可以互连。
- 信号与槽的连接可以跨线程。
- 信号与槽的连接方式即可以是同步,也可以是异步。
- 信号的参数可以是任何的Python类型。
信号与槽的连接工作示意过程如图所示。

2 编辑信号与槽
例如,通过信号(signal)与槽(slot)实现一个单击按钮关闭主窗口的运行效果,具体操作步骤如下:
1)打开Qt Designer设计器,从左侧的工具箱中向窗口中添加一个PushButton按钮,并设置按钮的text属性为关闭,如图所示。

2)选中添加的关闭按钮,在菜单栏中选择编辑信号/槽菜单项,然后按住鼠标左键拖动至窗口的空白区域,如图所示。

3)拖动至窗口的空白区域松开鼠标后,将自动弹出配置连接对话框,首先选中显示从QWidget继承的信号和槽复选框,然后在上方的信号与槽列表中分别选择选中clicked()和close(),如图所示。

Info: 说明 上图中,选中的
clicked()为按钮的信号,然后选中的close()为槽函数(方法),工作逻辑是,单击按钮时发射clicked信号,该信号被主窗口的close()槽函数(方法)所捕获,并触发了关闭主窗口的行为。
4)单击OK按钮,即可完成信号与槽的关联,效果如图所示。

保存.ui文件,并使用PyCharm中配置的Pyuic工具将其转换为.py文件,转换后实现单击按钮关闭窗口的关键代码如下:
self.pushButton.clicked.connect(MainWindow.close)
为转换后的Python代码添加程序入口,然后运行程序,效果如图所示,单击关闭按钮,即可关闭当前窗口。

3 自定义槽
在前面的内容中,介绍了如何将控件的信号与PyQt5内置的槽函数相关联,除此之外,用户还可以自定义槽,自定义槽本质上就是自定义一个函数,该函数来实现相应的功能。
实例 信号与自定义槽的绑定
自定义一个槽函数,用来单击按钮时,弹出一个欢迎进入PyQt5编程世界的信息提示框。代码如下:
def showMessage(self):
from PyQt5.QtWidgets import QMessageBox # 导入QMessageBox类
# 使用information()方法弹出信息提示框
QMessageBox.information(MainWindow,"提示框","欢迎进入PyQt5编程世界",QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes)
Info: 说明 上面代码中用到了
QMessageBox类,该类是PyQt5中提供的一个对话框类
4 将自定义槽连接到信号
在自定义槽函数之后,即可与信号进行关联,比如,这里与PushButton按钮的clicked信号关联,即在单击PushButton按钮时,弹出信息提示框,将自定义槽连接到信号的代码如下:
self.pushButton.clicked.connect(self.showMessage)
运行程序,单击窗口中的PushButton按钮,即可弹出信息提示框,效果如图所示。
