信号(signal)和槽(slot)是Qt的核心机制。在创建事件循环之后,通过建立信号和槽的连接就可以实现对象之间的通信。当信号发射(emit)时,连接的槽函数将会自动执行。在PyQt5中,信号和槽通过QObject.signal.connect()连接。
所有从QObject类或其子类(如QWidget)派生的类都能够包含信号和 槽。当对象改变其状态时,信号就由该对象发射出去。槽由于接收信号,但它们是普通的对象成员函数。多个信号可以与单个槽进行连接,单个信号也可以与多个槽进行连接。总之,信号和槽构建了一种强大的控件编程机制。
在Qt编程中,通过Qt信号槽机制对鼠标或键盘在界面上的操作进行响应处理,例如对鼠标单击按钮的处理。对控件发射的信号指定对应的处理槽函数的方法:第一,在窗口的UI设计中操作添加信号和槽;第二,通过代码连接信号和槽;第三种,通过Eric的“生成对话框代码”的功能产生信号和槽。
1. 内置信号和槽函数
from PyQt5.QtWidgets import * import sys class WinForm(QWidget): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("内置的信号/槽示例") self.resize(330, 50) btn = QPushButton("关闭", self) btn.clicked.connect(self.close) if __name__ == "__main__": app = QApplication(sys.argv) win = WinForm() win.show() sys.exit(app.exec_())
2. 内置信号和自定义槽函数
from PyQt5.QtWidgets import * import sys class WinForm(QWidget): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("内置的信号和自定义槽函数示例") self.resize(330, 50) btn = QPushButton("关闭", self) btn.clicked.connect(self.btn_close) def btn_close(self): self.close() if __name__ == "__main__": app = QApplication(sys.argv) win = WinForm() win.show() sys.exit(app.exec_())
3. 自定义信号和内置槽函数
from PyQt5.QtWidgets import * from PyQt5.QtCore import pyqtSignal import sys class WinForm(QWidget): # 自定义信号,不带参数 button_clicked_signal = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("自定义信号和槽函数示例") self.resize(330, 50) btn = QPushButton("关闭", self) # 连接信号与槽函数 btn.clicked.connect(self.btn_clicked) # 接收信号,连接到槽函数 self.button_clicked_signal.connect(self.close) def btn_clicked(self): # 发送自定义信号,无参数 self.button_clicked_signal.emit() if __name__ == "__main__": app = QApplication(sys.argv) win = WinForm() win.show() sys.exit(app.exec_())
4. 自定义信号和槽函数
from PyQt5.QtWidgets import * from PyQt5.QtCore import pyqtSignal import sys class WinForm(QWidget): # 自定义信号,不带参数 button_clicked_signal = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("自定义信号和槽函数示例") self.resize(330, 50) btn = QPushButton("关闭", self) # 连接信号与槽函数 btn.clicked.connect(self.btn_clicked) # 接收信号,连接到自定义的槽函数 self.button_clicked_signal.connect(self.btn_close) def btn_clicked(self): # 发送自定义信号,无参数 self.button_clicked_signal.emit() def btn_close(self): self.close() if __name__ == "__main__": app = QApplication(sys.argv) win = WinForm() win.show() sys.exit(app.exec_())