如何在 pyqt 中实现全局事件总线
前言
在 Qt 中可以使用信号和槽机制很方便地实现部件之间的通信,考虑下面这样的场景:

我想要点击任意一个专辑卡并通知主界面跳转到专辑界面,那么一种实现方式如上图所示:点击任意一个蓝色方框所示的专辑卡,发出 switchToAlbumIntetrfaceSig 给父级部件专辑卡视图,因为专辑卡视图有许多个分组,比如上图中为 aiko 分组,可能还有 柳井爱子 分组,那么这些视图都应该将 switchToAlbumInterfaceSig 转发给父级窗口我的音乐界面,我的音乐界面再转发给主界面,从而实现界面跳转。
可以看到上面这种做法很麻烦,专辑卡上拥有 switchToAlbumInterfaceSig 属性就算了,还要连累父级专辑卡视图以及祖父级我的音乐界面也拥有这个属性才能实现信号的转发。有没有一种方式可以省掉中间的转发过程,从而一步到位通知主界面呢?这就需要使用下面所介绍的全局事件总线思想。
全局事件总线
Vue 中的全局事件总线
在 vue 中要实现任意组件间通信,可以在 Vue.prototype 上添加一个全局事件总线 $bus 属性,当组件 A 想要给组件 B 发送一些数据时,只需要在 A 中 this.$bus.$emit(事件名,数据) 发送数据,在 B 中 this.$bus.$on(事件名,回调) 就能通过总线收到数据,而无需借助其他组件的转发。将事件名视为信号,回调视为槽函数,那么这个过程和 Qt 的信号和槽机制神似。
Qt 中的全局事件总线
仿照上述过程,我们来定义一个全局事件总线类,并使用单例模式保证只能实例化出一个对象:
# coding:utf-8
from PyQt5.QtCore import QObject, pyqtSignal
class SignalBus(QObject):
""" 全局事件总线 """
switchToAlbumInterfaceSig = pyqtSignal(str)
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(SignalBus, cls).__new__(cls, *args, **kwargs)
return cls._instance
bus = SignalBus()
回到最初的那个例子,现在我们只需导入 bus 对象,点击 aikoの詩。 专辑卡时 bus.switchToAlbumInterfaceSig.emit('aiko - aikoの詩。') 来发送切换到专辑界面的信号,然后在主界面中 bus.switchToAlbumInterfaceSig.connect(self.switchToAlbumInterface) 即可,这样就省去了信号的转发流程,代码会简洁许多。(界面的实现代码在 Groove,据说把仓库从 public 变为 private 之后 star 会被清空,别问我是怎么知道的 )以上~~
如何在 pyqt 中实现全局事件总线的更多相关文章
- Vue学习之--------全局事件总线(2022/8/22)
文章目录 1.全局事件总线基础知识(GlobalEventBus) 2.图解过程 3.代码实例 3.1 main.js 3.1 App.vue 3.2 School.vue 3.3 Student.v ...
- 组件通信之全局事件总线 & 消息订阅发布
全局事件总线 介绍 一种组件间通信的方式,适用于任意组件间通信. 在使用全局事件总线之前需要一些知识准备 所有组件实例的原型对象的原型对象就是 Vue 的原型对象,即VueComponent.prot ...
- 如何在 pyqt 中捕获并处理 Alt+F4 快捷键
前言 如果在 Windows 系统的任意一个窗口中按下 Alt+F4,默认行为是关闭窗口(或者最小化到托盘).对于使用了亚克力效果的窗口,使用 Alt+F4 最小化到托盘,再次弹出窗口的时候可能出现亚 ...
- 如何在pyqt中自定义无边框窗口
前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...
- 如何在pyqt中实现窗口磨砂效果
磨砂效果的实现思路 这两周一直在思考怎么在pyqt上实现窗口磨砂效果,网上搜了一圈,全都是 C++ 的实现方法.正好今天查python的官方文档的时候看到了 ctypes 里面的 HWND,想想倒不如 ...
- 如何在pyqt中实现win10亚克力效果
亚克力效果的实现思路 上一篇博客<如何在pyqt中实现窗口磨砂效果> 中实现了win7中的Aero效果,但是和win10的亚克力效果相比,Aero还是差了点内味.所以今天早上又在网上搜了一 ...
- 如何在pyqt中通过调用 SetWindowCompositionAttribute 实现Win10亚克力效果
亚克力效果 在<如何在pyqt中实现窗口磨砂效果>和<如何在pyqt中实现win10亚克力效果>中,我们调用C++ dll来实现窗口效果,这种方法要求电脑上必须装有MSVC.V ...
- 如何在pyqt中在实现无边框窗口的同时保留Windows窗口动画效果(一)
无边框窗体的实现思路 在pyqt中只要 self.setWindowFlags(Qt.FramelessWindowHint) 就可以实现边框的去除,但是没了标题栏也意味着窗口大小无法改变.窗口无法拖 ...
- 如何在pyqt中给无边框窗口添加DWM环绕阴影
前言 在之前的博客<如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果>中,我们实现了窗口的亚克力效果,同时也用SetWindowC ...
随机推荐
- Swoole 中使用 Table 内存表实现进程间共享数据
背景 在多进程模式下进程之间的内存是相互隔离的,在一个工作进程中的全局变量和超全局变量,在另一个工作进程中是无法读取和操作的. 如果只有一个工作进程,则不存在进程隔离问题,可以使用全局变量和超全局变量 ...
- 我踩过的python的坑
1. string中Template用法 变量名不能是${tradeDate+1}, python无法识别其为变量,应改为 ${tradeDate1} 变量替换的语句:data_new = Templ ...
- Python web框架开发 - WSGI协议
浏览器进行http请求的时候,不单单会请求静态资源,还可能需要请求动态页面. 那么什么是静态资源,什么是动态页面呢? 静态资源 : 例如html文件.图片文件.css.js文件等,都可以算是静态资源 ...
- [Flask] 安装virtualenv时候出现的问题
1.HTTPError: 404 Client Error: Not Found for url: ...的错误 ubuntu@VM-0-6-ubuntu:~/myprojects$ virtuale ...
- 灵雀云发布云原生制品仓库Harbor企业版(Alauda Registry Service for Harbor)
灵雀云发布云原生制品仓库Harbor企业版(Alauda Registry Service for Harbor) 近日,国内领先的云原生全栈私有云提供商灵雀云宣布,推出企业版云原生制品仓库Ala ...
- 带你自定义实现Spring事件驱动模型
Spring 事件驱动模型概念 Spring 事件驱动模型就是观察者模式很经典的一个应用,我们可以通过Spring 事件驱动模型来完成代码的解耦. 三角色 Spring 事件驱动模型或者说观察者模式需 ...
- orleans集群及负载均衡实现
netcore6项目,微服务框架选orleans ,国内似乎没什么项目在用,坑多无资料.orleans文档可以解决几乎,只能看官方资料. Introduction | Microsoft Orlean ...
- WSL与gnome-desktop
WSL与gome-desktop 经过测试和检索 确定WSL1无法在gome-desktop实现GUI桌面 只能实现其中应用的现实,比如打开记事本在Xserver https://www.reddit ...
- Nginx请求连接限制
目录 Nginx的请求限制 HTTP协议的连接与请求 连接限制 配置示例 做个演示: 请求限制 配置示例 基本指令 limit_req_zone limit_req zone 做个演示: Nginx的 ...
- Spring系列7:`autowire`自动装配怎么玩
回顾 前几篇我们介绍各种依赖依赖注入,都是显式指定的,配置明确但同时也有些繁杂和重复."很多发明的出发点,都是为了偷懒,懒人是推动社会进步的原动力".Spring 提供了自动注入依 ...