PySide6/PyQt信号总线的实现、使用以及使用建议
PySide6/PyQt信号总线的实现、使用以及使用建议
有人说编程的逻辑来源于对现实的抽象,我觉得他是对的,就比如信号总线这个概念(可以理解为类似数据线那种线)。现实是里边有一条一条的小细线(这个就可以理解为一个信号),它们有的负责供电,有的负责传输数据。信号总线是这种数据线的抽象,里边是一堆信号,不过他们更多是用来传输状态。
必要的知识
在这里应该先了解一下 Qt的信号和槽函数以及常见的连接!
信号和槽
为了方便理解,这里把红路灯抽象为 这种机制:
- 红灯亮:信号
- 行人停下: 槽函数
信号与槽的各种连接
有如下几种连接:
- 信号与信号
- 信号与槽
- 一个信号连接多个槽
- 多个信号连接一个槽
这里建议看看官网的描述: 官网链接
信号总线实现
要点:
- 继承自
QObject - 有一个以上信号
Signal(类属性) - 实例化该总线类
代码如下:
from PySide6.QtCore import QObject,Signalclass SignalBus(QObject):""" 信号总线 """a_singal = Signal(str)b_singal = Signal(bool)# 创建全局信号总线实例(只实例化一次)
signal_bus = SignalBus()
怎么使用信号总线
一句话:
- 需要发送的时候发送,需要接收的时候接收
注意:
- 发送信号需要借助其他信号 也就是: 信号与信号连接
示例代码:
发送信号:
from you_signal_bus_path import siganl_bus##省略代码
self.your_btn.clicked.connect(lambda :siganl_bus.a_singal.emit("a"))
self.your_btn.toggled.connect(siganl_bus.b_singal.emit)
## 这里toggled 信号一定会传输布尔值 所以不需要匿名函数传参数
接收信号:
from you_signal_bus_path import siganl_bus##省略代码
siganl_bus.a_singal.connect(lambda signal_str: print(signal_str))
siganl_bus.b_singal.connect(lambda toggled: print(toggled))
使用建议
- 信号可复用
- 传输字符串的信号可复用性高
- 划分责任避免串线(过渡复用)
- 你无法在同一个部件类内 套壳该部件自定义信号
具体讲讲4,如下案例
某个按钮类的行为触发:A
自定义文本改变信号: B
文本改变信号:C
实际执行槽函数:D
A 一个类 F
B、C、D另一个类 E
# E
A.connect(B)
# F
C=B #或 C.connect(B.emit)
B.connect(D)
这是一个错误的示例 因为在F里信号和槽已经连接(形成闭环)了
写到最后
当你遇到问题的时候不要慌张,执行如下程序,也许可以解决:
- 判断是否有可复用的方法或函数 -> if has:调用 else 3
- 分析逻辑是否有问题 -> if has:重构 else 3
- 参考其他人的解决方案/提升认知(看看有没有忽略的文档)
