通俗的讲:pyside6 信号其实就是指发生了什么,槽就是在接收到这个信号后要做什么。
PySide6 的信号按控件类型分类,不同控件有专属的核心信号,同时也有一些通用信号适用于所有控件。
下面我会按 “通用信号 + 常用控件专属信号” 的维度,列举商业化开发中高频使用的信号,并附上场景说明,方便你对应实际开发需求:
一、通用信号(所有控件都具备)
这类信号是所有 Qt 控件的基础,适用于任意 UI 元素:
| 信号名 | 含义(发生了什么) | 附带数据 | 典型场景 |
|---|---|---|---|
clicked | 控件被鼠标点击(最常用) | 无(或 bool) | 按钮点击、复选框选中 |
pressed | 鼠标按下控件(未松开) | 无 | 实现 “按下时高亮” 等交互 |
released | 鼠标松开控件(按下后) | 无 | 配合 pressed 做按压动效 |
hovered | 鼠标悬停在控件上 | 无 | 悬浮提示、按钮变色 |
focusIn | 控件获得焦点(如输入框选中) | 无 | 输入框获得焦点时高亮边框 |
focusOut | 控件失去焦点 | 无 | 输入框失去焦点时校验内容 |
destroyed | 控件被销毁 | 控件对象 | 资源释放、清理关联数据 |
二、常用控件专属信号(商业化开发高频)
1. 输入类控件(QLineEdit/QTextEdit)
| 信号名 | 含义(发生了什么) | 附带数据 | 典型场景 |
|---|---|---|---|
textChanged | 文本内容发生变化(实时) | 最新文本(str) | 实时搜索、动态校验输入内容 |
textEdited | 文本被用户编辑(排除代码修改) | 最新文本(str) | 区分用户输入和程序自动修改 |
returnPressed | 按下回车键 | 无 | 输入完成后提交(如搜索框) |
editingFinished | 编辑完成(失去焦点 / 按回车) | 无 | 最终校验输入内容 |
2. 选择类控件(QComboBox/QSlider/QCheckBox)
| 信号名 | 含义(发生了什么) | 附带数据 | 典型场景 |
|---|---|---|---|
currentIndexChanged | 下拉框选中项索引变化 | 索引(int) | 下拉框选值后联动更新其他控件 |
currentTextChanged | 下拉框选中项文本变化 | 文本(str) | 直接获取下拉框选中的文字 |
valueChanged | 滑块 / 进度条数值变化 | 数值(int/float) | 音量调节、进度展示 |
stateChanged | 复选框 / 单选框状态变化 | 状态(int) | 勾选后显示 / 隐藏相关选项 |
3. 表格 / 列表类控件(QTableView/QListWidget)
| 信号名 | 含义(发生了什么) | 附带数据 | 典型场景 |
|---|---|---|---|
currentRowChanged | 表格选中行变化 | 行索引(int) | 选中行后加载该行详情 |
cellClicked | 表格单元格被点击 | 行 / 列索引(int,int) | 点击单元格编辑内容 |
itemClicked | 列表项被点击 | 列表项对象 | 选中列表项后执行操作 |
itemSelectionChanged | 列表 / 表格选中项变化 | 无 | 批量操作前判断选中状态 |
4. 窗口 / 布局类(QMainWindow/QDialog)
| 信号名 | 含义(发生了什么) | 附带数据 | 典型场景 |
|---|---|---|---|
closeEvent | 窗口关闭前触发 | 关闭事件对象 | 提示 “是否保存未修改内容” |
resizeEvent | 窗口大小调整 | 大小事件对象 | 自适应布局、重绘图表 |
accepted | 对话框点击 “确认” 按钮 | 无 | 对话框提交数据 |
rejected | 对话框点击 “取消” 按钮 | 无 | 对话框放弃操作 |
三、自定义信号(商业化开发必备)
除了 Qt 内置信号,还可以根据业务需求自定义信号,这是处理复杂逻辑的核心:
from PySide6.QtCore import QObject, Signal # 定义自定义信号(可指定参数类型) class MyBusinessLogic(QObject): # 无参数信号 task_started = Signal() # 带参数信号(支持多类型、多参数) task_progress = Signal(int, str) # 进度值 + 提示文本 task_finished = Signal(bool, str) # 是否成功 + 结果信息 # 使用自定义信号 logic = MyBusinessLogic() # 绑定槽函数 logic.task_progress.connect(lambda value, msg: print(f"进度:{value}%,{msg}")) # 发射信号(触发事件) logic.task_progress.emit(50, "正在处理数据...")四、快速查找信号的实用技巧
- 官方文档:访问 Qt 官方文档(https://doc.qt.io/qt-6/),搜索控件名(如
QPushButton),在 “Signals” 标签下可查看所有内置信号; - 代码提示:在 PyCharm/VS Code 中,输入
控件对象.后,编辑器会自动提示以小写开头的信号(如btn.clicked); - 核心原则:记住 “信号 = 发生了什么”,比如想处理 “输入框文本变化”,就找
textChanged;想处理 “表格行选中”,就找currentRowChanged。
- PySide6 信号按通用 / 控件专属分类,核心是 “对应控件的交互事件”;
- 高频信号:
clicked(点击)、textChanged(文本变化)、currentIndexChanged(选中项变化)、valueChanged(数值变化); - 自定义信号可满足商业程序的个性化交互需求,是扩展信号槽机制的关键。
可以再用一个更通俗的生活例子巩固这个认知:
- 信号= 家里的门铃响了(“发生了什么”:有人按门铃这个事件);
- 槽= 你走到门口开门、询问对方身份(“接收到信号后要做什么”:响应门铃事件的具体动作)。
再用代码印证这个核心逻辑
import sys from PySide6.QtWidgets import QApplication, QWidget, QPushButton from PySide6.QtCore import Slot class Demo(QWidget): def __init__(self): super().__init__() self.btn = QPushButton("点我触发信号", self) # 信号:btn.clicked → 发生了“按钮被点击”这件事 self.btn.clicked.connect(self.handle_click) # 槽:handle_click → 收到“按钮被点击”信号后,要做的事 @Slot() def handle_click(self): print("信号:按钮被点击了 → 槽:执行打印操作") if __name__ == "__main__": app = QApplication(sys.argv) win = Demo() win.show() sys.exit(app.exec())补充一个小细节(不影响核心理解,但更完整)
信号除了 “告知发生了什么”,还可以附带 “这件事的相关信息”(比如 “谁按的门铃”),槽也可以接收这些信息并针对性处理:
import sys from PySide6.QtWidgets import QApplication, QWidget, QSlider from PySide6.QtCore import Slot class Demo(QWidget): def __init__(self): super().__init__() self.slider = QSlider(self) self.slider.setRange(0, 100) # 信号:valueChanged → 发生了“滑块值变化”这件事,附带“当前值”这个信息 self.slider.valueChanged.connect(self.handle_slider) # 槽:handle_slider → 收到“滑块值变化”信号后,根据附带的数值做对应操作 @Slot(int) def handle_slider(self, value): # value 是信号附带的“相关信息” print(f"信号:滑块值变了 → 槽:当前值是{value},执行打印") if __name__ == "__main__": app = QApplication(sys.argv) win = Demo() win.show() sys.exit(app.exec())- 信号 = 发生了什么(事件),槽 = 收到信号后要做什么(响应动作);
- 扩展细节:信号可附带 “事件相关信息”,槽可接收这些信息做针对性处理;
- 这个逻辑是 PySide6 所有交互的基础,不管是简单按钮点击,还是复杂的跨线程通信、表格交互,本质都是 “事件发生(信号)→ 执行动作(槽)”。