干货:信号槽

信号槽第一性原理:QObject、emit、connect 线程亲缘性

信号槽是 Qt 的"事件总线"

在 PySide6 里,信号槽(signal/slot)就是对象之间的解耦通信:A 对象发信号,B 对象的槽函数被调用,A 不需要知道 B 是谁。

三层组成:

  • QObject:能发信号的都是它派生的。
  • signal:某个对象声明一个信号,表示"我这儿有事发生了"。
  • slot/connect:把某个对象的信号,连到另一个对象的函数上。
python 复制代码
from PySide6.QtCore import Signal, QObject

class UserManager(QObject):
    user_logged_in = Signal(str)      # 声明一个带参数的信号

    def login(self, name):
        self.user_logged_in.emit(name)  # 发信号

# 另一个对象 connect
manager = UserManager()
manager.user_logged_in.connect(lambda name: print(f"欢迎 {name}"))
manager.login("tom")

关键是"信号在哪线程 emit"

PySide6 信号跟线程关系很大:

  • 若信号的发射线程 == 接收槽所在的线程,直接调用(DirectConnection)。
  • 若跨线程 ,Qt 会走 QueuedConnection,把事件投递到接收对象所在线程的事件循环,槽函数在接收线程执行。

这就是它天然线程安全的秘密:你只管在哪个线程 emit,Qt 保证槽在正确的(接收者所在)线程跑。

我们项目的应用

UiBridge 就是一个装信号的 QObject:

python 复制代码
class UiBridge(QObject):
    result_received = Signal(dict)

worker 线程里 emit,主线程 connect 的 _handle_result 收到后刷新 UI。因为 emit 在 worker,槽在主线程,Qt 自动 queue 过去,UI 不会被 worker 线程直接操作,也就不会崩。

一句话

信号槽 = 对象间的解耦事件 + 自动的线程调度。理解"信号在哪个线程发、槽在哪个线程收",跨线程 UI 就不会出幺蛾子。


相关推荐
gCode Teacher 格码致知5 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
马良神笔6 小时前
2026 年Rag最近技术前沿总结
后端·python·django
不像程序员的程序媛6 小时前
maven基础
python·pycharm·maven
xiaogai_gai7 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
benchmark_cc8 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu8 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
估值探索者9 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
田里的水稻9 小时前
PyTorch_Dataloader\TensorBoard---数据加载与可视化
人工智能·pytorch·python·神经网络·机器学习
Dmz丶9 小时前
前端转 AI 100 天 Day 27:Docker 容器化——从“我电脑能跑“到“到处能跑“
python
卿卿的产品经理日记9 小时前
【AI产品经理实战】Day 38|try-except 踩坑实录:报错是数据
人工智能·笔记·python·学习·产品经理