干货:信号槽

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


相关推荐
Wx-bishekaifayuan1 小时前
springboot生活易购超市管理系统54086-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
数字融合1 小时前
透明化数字孪生智慧养老平台运维服务项目
人工智能·python·virtualenv
smj2302_796826521 小时前
解决leetcode第4064题至多一次取反能被k整除的最长子数组II
python·算法·leetcode
happylifetree2 小时前
Python01-08:练习
python
空奈qwq2 小时前
ANN 全连接神经网络入门指南:从神经元到深度学习的第一步
人工智能·python·深度学习·神经网络·算法·机器学习
维克兜率天2 小时前
【维克】弹性策略:用“乖离率“捕捉超跌反弹
android·开发语言·python·深度学习·kotlin·量化
SamChan903 小时前
PDF页面旋转与CropBox陷阱:译文回填位置总是错位的根因实测
python·ai·pdf·wpf
程序员清风3 小时前
Java 智能体开发:从对话接口到任务执行
java·人工智能·python
2601_966949653 小时前
每日自动更新股票行情:如何设计可靠的数据任务,避免重复写入和脏数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash