在 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, QPushButton
class 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
。