PyQt中的信号与槽(Signals and Slots)机制是一种用于对象间通信的强大机制。它允许一个对象发出信号,而其他对象可以连接到这些信号并执行相应的槽函数。这种机制是Qt框架的核心特性之一,也是PyQt编程中的重要组成部分。
信号与槽的基本概念
信号(Signal):当某个特定事件发生时,一个信号会被发射。例如,当用户点击一个按钮时,按钮会发出一个“clicked”信号。
槽(Slot):槽是普通的Python函数或方法,可以被连接到信号上。当信号被发射时,与之连接的槽函数会被调用。
如何使用信号与槽
在PyQt中,你可以使用connect()
方法将信号连接到槽。以下是一个简单的例子:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
# 创建一个按钮
self.button = QPushButton("Click me!")
# 定义一个槽函数
def on_button_click():
print("Button clicked!")
# 将按钮的clicked信号连接到槽函数
self.button.clicked.connect(on_button_click)
# 设置布局
layout = QVBoxLayout()
layout.addWidget(self.button)
self.setLayout(layout)
self.setWindowTitle("Signal and Slot Example")
self.resize(300, 200)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
在这个例子中,当用户点击按钮时,on_button_click
槽函数会被调用,并打印出一条消息。
以下是一些常见的PyQt组件及其信号与槽的例子:
1. QPushButton
信号:clicked
例子:
from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget
def on_button_click():
print("Button was clicked!")
app = QApplication([])
window = QWidget()
layout = QVBoxLayout(window)
button = QPushButton("Click Me")
button.clicked.connect(on_button_click)
layout.addWidget(button)
window.show()
app.exec_()
2. QLineEdit
信号:textChanged
, returnPressed
例子:
from PyQt5.QtWidgets import QApplication, QLineEdit, QVBoxLayout, QWidget
def on_text_changed(new_text):
print(f"Text changed to: {new_text}")
def on_return_pressed():
print("Return key was pressed!")
app = QApplication([])
window = QWidget()
layout = QVBoxLayout(window)
line_edit = QLineEdit()
line_edit.textChanged.connect(on_text_changed)
line_edit.returnPressed.connect(on_return_pressed)
layout.addWidget(line_edit)
window.show()
app.exec_()
3. QComboBox
信号:currentIndexChanged
, activated
例子:
from PyQt5.QtWidgets import QApplication, QComboBox, QVBoxLayout, QWidget
def on_selection_changed(index):
print(f"Selected index: {index}")
app = QApplication([])
window = QWidget()
layout = QVBoxLayout(window)
combo_box = QComboBox()
combo_box.addItems(["Option 1", "Option 2", "Option 3"])
combo_box.currentIndexChanged.connect(on_selection_changed)
layout.addWidget(combo_box)
window.show()
app.exec_()
4. QCheckBox
信号:stateChanged
例子:
from PyQt5.QtWidgets import QApplication, QCheckBox, QVBoxLayout, QWidget
def on_state_changed(state):
if state == 2: # Qt.Checked
print("Checkbox is checked.")
else:
print("Checkbox is unchecked.")
app = QApplication([])
window = QWidget()
layout = QVBoxLayout(window)
check_box = QCheckBox("Check me")
check_box.stateChanged.connect(on_state_changed)
layout.addWidget(check_box)
window.show()
app.exec_()
5. QSlider
信号:valueChanged
例子:
from PyQt5.QtWidgets import QApplication, QSlider, QVBoxLayout, QWidget
def on_value_changed(value):
print(f"Slider value changed to: {value}")
app = QApplication([])
window = QWidget()
layout = QVBoxLayout(window)
slider = QSlider()
slider.setMinimum(0)
slider.setMaximum(100)
slider.valueChanged.connect(on_value_changed)
layout.addWidget(slider)
window.show()
app.exec_()
这些例子展示了如何使用PyQt中一些常见组件的信号与槽机制。通过连接这些信号到相应的槽函数,你可以轻松地响应用户的交互行为。