在 PySide6 的 Qt 框架中,connect
和 emit
是信号与槽机制的两个核心操作,但它们的作用完全不同:
1. connect()
:建立信号与槽的绑定
- 作用:将某个信号(Signal)与一个槽函数(Slot)或其他信号连接起来。
当信号被触发时,连接的槽函数会自动执行。 - 适用场景:
你希望响应某个事件时使用,例如:button.clicked.connect(self.on_button_clicked) # 按钮点击后执行 on_button_clicked
- 特点:
- 一个信号可以连接多个槽函数。
- 槽函数可以是普通函数、lambda 表达式或其他信号。
2. emit()
:主动触发信号
- 作用:手动触发某个信号,通知所有已连接的槽函数执行。
- 适用场景:
当你需要主动通知其他对象某个事件发生时使用,例如:class MyWidget(QWidget):# 定义一个自定义信号data_ready = Signal(str)def process_data(self):result = "Data processed!"self.data_ready.emit(result) # 手动触发信号,传递结果
- 特点:
- 内置信号(如按钮的
clicked
)通常由 Qt 自动触发,无需手动emit
。 - 自定义信号必须通过
emit()
手动触发。
- 内置信号(如按钮的
为什么有的地方用 connect
,有的用 emit
?
-
connect
的使用场景:
需要定义事件响应逻辑时,例如将按钮点击事件绑定到槽函数。 -
emit
的使用场景:
需要主动触发事件时,例如自定义信号或需要控制信号触发时机的场景。
类比理解
connect
类似于给电话(信号)设置来电铃声(槽函数)。emit
类似于主动拨打电话(触发信号),让对方的铃声响起。
示例代码
from PySide6.QtWidgets import QApplication, QPushButtonclass MyApp:def __init__(self):self.app = QApplication([])self.button = QPushButton("Click Me")# 连接内置信号(按钮点击时自动触发)self.button.clicked.connect(self.on_click)# 自定义信号self.button.custom_signal = Signal(str)self.button.custom_signal.connect(self.on_custom_signal)def on_click(self):print("Button clicked! Now emit custom signal.")# 手动触发自定义信号self.button.custom_signal.emit("Hello from custom signal!")def on_custom_signal(self, message):print(f"Received: {message}")MyApp().app.exec()
总结
connect
:绑定事件与响应逻辑(被动等待信号触发)。emit
:主动触发信号(主动发起事件通知)。- 内置信号通常由 Qt 自动管理,而自定义信号需要手动
emit
。