如何在pyqt中实现全局事件实战记录

 更新时间:2022年02月14日 09:01:48   作者:之一Yo  
事件的处理机制非常的复杂,属于PyQt底层的事,不必我们关心,学会使用就行,下面这篇文章主要给大家介绍了关于如何在pyqt中实现全局事件的相关资料,需要的朋友可以参考下

前言

在 Qt 中可以使用信号和槽机制很方便地实现部件之间的通信,考虑下面这样的场景:

我想要点击任意一个专辑卡并通知主界面跳转到专辑界面,那么一种实现方式如上图所示:点击任意一个蓝色方框所示的专辑卡,发出 switchToAlbumIntetrfaceSig 给父级部件专辑卡视图,因为专辑卡视图有许多个分组,比如上图中为 aiko 分组,可能还有 柳井爱子 分组,那么这些视图都应该将 switchToAlbumInterfaceSig 转发给父级窗口我的音乐界面,我的音乐界面再转发给主界面,从而实现界面跳转。

可以看到上面这种做法很麻烦,专辑卡上拥有 switchToAlbumInterfaceSig 属性就算了,还要连累父级专辑卡视图以及祖父级我的音乐界面也拥有这个属性才能实现信号的转发。有没有一种方式可以省掉中间的转发过程,从而一步到位通知主界面呢?这就需要使用下面所介绍的全局事件总线思想。

全局事件总线

Vue 中的全局事件总线

在 vue 中要实现任意组件间通信,可以在 Vue.prototype 上添加一个全局事件总线 $bus 属性,当组件 A 想要给组件 B 发送一些数据时,只需要在 A 中 this.$bus.$emit(事件名,数据) 发送数据,在 B 中 this.$bus.$on(事件名,回调) 就能通过总线收到数据,而无需借助其他组件的转发。将事件名视为信号,回调视为槽函数,那么这个过程和 Qt 的信号和槽机制神似。

Qt 中的全局事件总线

仿照上述过程,我们来定义一个全局事件总线类,并使用单例模式保证只能实例化出一个对象:

复制<code># 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中实现全局事件的文章就介绍到这了,更多相关pyqt实现全局事件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 实现的IP 存活扫描脚本

    python 实现的IP 存活扫描脚本

    这篇文章主要介绍了python 实现的IP 存活扫描脚本,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • Python xlrd模块导入过程及常用操作

    Python xlrd模块导入过程及常用操作

    这篇文章主要介绍了Python xlrd模块导入过程及常用操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • python单向循环链表原理与实现方法示例

    python单向循环链表原理与实现方法示例

    这篇文章主要介绍了python单向循环链表原理与实现方法,结合实例形式详细分析了Python单向循环链表概念、原理、定义及使用方法,需要的朋友可以参考下
    2019-12-12
  • Python过滤函数filter()使用自定义函数过滤序列实例

    Python过滤函数filter()使用自定义函数过滤序列实例

    这篇文章主要介绍了Python过滤函数filter()使用自定义函数过滤序列实例,配合自定义函数可以实现许多强大的功能,需要的朋友可以参考下
    2014-08-08
  • python 两个数据库postgresql对比

    python 两个数据库postgresql对比

    这篇文章主要介绍了python 两个数据库postgresql对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • python基础教程之csv文件的写入与读取

    python基础教程之csv文件的写入与读取

    CSV即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用以存储表格数据,包括数字或者字符,下面这篇文章主要给大家介绍了关于python基础教程之csv文件的写入与读取的相关资料,需要的朋友可以参考下
    2022-08-08
  • python 读写txt文件 json文件的实现方法

    python 读写txt文件 json文件的实现方法

    下面小编就为大家带来一篇python 读写、创建 文件的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Python深度学习实战PyQt5安装与环境配置过程详解

    Python深度学习实战PyQt5安装与环境配置过程详解

    本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战。什么叫从零开始?从软件安装、环境配置开始。不跳过一个细节,不漏掉一行代码,不省略一个例图
    2021-10-10
  • Python编程获取终端命令行参数示例

    Python编程获取终端命令行参数示例

    这篇文章主要为大家介绍了Python编程获取终端命令行参数示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Python使用fastapi快速编写一个增删改查的接口

    Python使用fastapi快速编写一个增删改查的接口

    这篇文章主要为大家详细介绍了Python如何使用fastapi快速编写一个增删改查的接口,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04

最新评论