干货:信号槽

信号槽第一性原理: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 就不会出幺蛾子。


相关推荐
合尘猫3 小时前
图片表格变结构化数据:OCR 后的三个坑
python·ocr
小小张说故事3 小时前
Python 里弱引用到底弱在哪:拆开 weakref.ref、回调陷阱和 WeakValueDictionary
python
用户019027581614 小时前
用 DuckDB 存查 A 股 K 线:零服务、SQL 直接分析
python
程序员果子5 小时前
本体构建方法
人工智能·python·知识图谱·agent框架·本体
天天被压力6 小时前
【A股分钟级高频数据完全手册 #11】券商实时行情数据接口:实时交易(券商源)接入与字段
java·人工智能·python
总裁余(余登武)6 小时前
【python项目】:1操作EXCEl自动化开发
python·自动化·excel
芝梵家电数据笔记6 小时前
用字段表核对暖菜板长期使用条件:结构、暖区、质保边界
python·家电·数据校验·dataclass·选购
天天被压力6 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python
卷无止境18 小时前
RAGFlow 项目全景报告:从文档解析引擎到 Agent 原生数据库
后端·python
灿飞屋19 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓