在 PyQt(以及 PySide)中,信号与槽(Signal and Slot) 是一个非常重要的机制,用于实现对象之间的通信。它允许一个对象在某个事件发生时发送信号(Signal),而其他对象可以连接到这个信号,并通过槽函数(Slot)来响应事件。这种机制是 Qt 框架的核心特性之一,广泛用于 GUI 编程中,用于处理用户交互、事件驱动编程等。
- 信号(Signal)
信号是对象发出的通知,表示某个事件已经发生。例如,按钮被点击、文本框内容发生变化、窗口关闭等。信号通常由 Qt 框架预先定义,但也可以自定义。
常见的信号:
QPushButton.clicked:按钮被点击时发出的信号。
QLineEdit.textChanged:文本框内容发生变化时发出的信号。
QCheckBox.toggled:复选框状态改变时发出的信号。
QTimer.timeout:定时器超时时发出的信号。
- 槽(Slot)
槽是一个普通的 Python 方法,用于响应信号。当信号被触发时,连接到该信号的槽函数会被自动调用。槽函数可以是任何普通的方法,但通常需要根据信号的参数进行定义。
示例槽函数:
def on_button_clicked(self):print("Button was clicked!")
- 信号与槽的连接
信号和槽之间的连接通过 connect() 方法实现。语法如下:
sender.signal.connect(receiver.slot)
sender 是发出信号的对象。
signal 是信号名称。
receiver 是接收信号的对象。
slot 是槽函数。
示例:
```python
def on_button_clicked(self):print("Button was clicked!")
self.button.clicked.connect(self.on_button_clicked)
当按钮被点击时,self.on_button_clicked 方法会被调用。
- 信号与槽的使用示例
以下是一个完整的示例,展示如何使用信号与槽机制:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabelclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Signal and Slot Example")self.setGeometry(100, 100, 400, 300)# 创建一个按钮self.button = QPushButton("Click Me", self)self.button.setGeometry(150, 100, 100, 30)# 创建一个标签self.label = QLabel("Not clicked yet", self)self.label.setGeometry(150, 150, 200, 30)# 连接信号与槽self.button.clicked.connect(self.on_button_clicked)def on_button_clicked(self):"""槽函数:按钮被点击时调用"""self.label.setText("Button was clicked!")if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())