当前位置:首页 > CN2资讯 > 正文内容

使用PySide6/PyQt6实现系统图标的展示和选择处理

4天前CN2资讯

在我们的基于PySide6/PyQt6的前端应用中,为了方便和重用,我们收集一些系统图标作为界面的使用,另外PySide/PyQt内部也有内置的图标,我们可以结合起来对图标进行统一的展示和选择处理,如在系统定义动态菜单的时候,我们可以为它指定具体的图标,从而灵活定义菜单的相关展示效果。

1、使用PySide6/PyQt6实现系统图标的展示和选择处理

 如上面所示,我们在菜单管理中需要汇总系统的相关图标,以便在菜单编辑中选择具体的图标效果。

选择图标会弹出一个可缩放的对话框出来,如下界面所示。

上面的图标对话框,我们为了更好的展现效果,使用一个自己封装好的可伸缩调整大小的对话框基类,如下关系

class MySizedDialog(QDialog): """自定义对话框基类""" def __init__( self, parent, title="默认对话框标题", can_scroll=True, show_btn_ok=True, size=(400, 600), pos=None, ): super().__init__(parent) self.log = settings.log.get_logger() self.setWindowTitle(title) self.setWindowIcon(images.catalog["appIcon"]) self.show_btn_ok = show_btn_ok self.can_scroll = can_scroll

关于可伸缩的对话框基类,我们在控件界面的底部,根据配置创建OK、Cancel的标准按钮集合,如下代码所示。

def _add_buttons(self) -> QDialogButtonBox: """创建按钮""" if self.show_btn_ok: # OK按钮、Cancel按钮都显示 # 创建标准按钮框(包括 OK 和 Cancel) button_box = QDialogButtonBox( QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel ) else: # 只显示 Cancel 按钮 button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Cancel) # 查找 OK 按钮 ok_button = button_box.button(QDialogButtonBox.StandardButton.Ok) if ok_button: # 检查按钮是否存在 # 设置图标 ok_button.setIcon(images.catalog["accept"]) # 异步绑定事件 ok_button.clicked.connect(self.on_ok) cancel_button = button_box.button(QDialogButtonBox.StandardButton.Cancel) if cancel_button: # 检查按钮是否存在 # 设置图标 cancel_button.setIcon(images.catalog["cancel"]) # 异步绑定事件 cancel_button.clicked.connect(self.on_cancel) return button_box

 

然后再构建一个图标选择的控件类即可,如下所示。

class MyImageDialog(ctrl.MySizedDialog): """图片选择对话框""" selected_name = "" selected_bitmap = None def __init__( self, parent, title="图片选择对话框", can_scroll=True, show_btn_ok=True, size=(800, 600), pos=None, return_icon_size=32, ): super().__init__( parent, title=title, can_scroll=can_scroll, show_btn_ok=show_btn_ok, size=size, pos=pos, ) self.return_icon_size = return_icon_size

 

 我们在图标选择的对话框,使用了选项卡控件来构建两个界面,一个是展示我们自定义的图标集合,一个是展示系统的内置图标集合。

def add_contents(self, panel: QWidget, grid_sizer: QGridLayout): """创建列表面板""" # 创建 QTabWidget self.notebook = QTabWidget(panel) self.notebook.setTabPosition(QTabWidget.TabPosition.North) self.first = self.create_first() self.second = self.create_second() self.notebook.addTab(self.first, get_bitmap("group"), "自定义内嵌图片") self.notebook.addTab(self.second, get_bitmap("group_key"), "系统图标") # 创建 QLabel,用于显示图片 self.bmpCtrl = QLabel(panel) # self.bmpCtrl.setFixedSize(32, 32) # 设置固定大小 self.bmpCtrl.setStyleSheet("border: 1px solid black;") # 设置边框样式 self.bmpCtrl.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) # 设置尺寸策略 grid_sizer.addWidget(self.notebook) grid_sizer.addWidget(self.bmpCtrl)

 我们以自定义的图表集合为例,我们创建的第一个create_first()函数 里面就是根据集合遍历进行展示,如下代码。

def create_first(self) -> QWidget: """创建自定义内嵌图片面板""" # 创建面板 panel = self._create_window(self, True) # 创建 WrapSizer icon_layout = ctrl.FlowLayout() # 遍历图片目录,创建图标 for idx, (key, value) in enumerate(images.catalog.items()): icon_panel = self.create_icon(panel, value, key) icon_layout.addWidget(icon_panel) child_panel = QWidget(panel) child_panel.setLayout(icon_layout) if isinstance(panel, QScrollArea): panel.setWidget(child_panel) return panel

 

而其中images是我们导入的系统全局图标集合,它是在系统初始化的时候进行内存加载,驻留全局使用的。

from core.core_images import CoreImages as images

 

 我们是在登录界面初始化的时候,就对系统全局图标集合进行加载的。

 我们和WxPython 的做法类似,使用Base64编码进行图片处理,其中Base64编码我们通过辅助类来构建生成。

 如果需要根据文件生成base64编码,单独运行辅助类即可,它运行提示输入文件,或者拖入文件即可获得文件名,运行后生成Base64编码和相关代码,拷贝过去使用即可。

 对于PySide/PyQT的内置图标

 QStyle.StandardPixmap 来获取并展示的

# 创建 WrapSizer icon_layout = ctrl.FlowLayout() # 获取所有标准图标 i = 0 for standard_icon in QStyle.StandardPixmap: icon = QApplication.style().standardIcon(standard_icon) # 获取标准图标 # 检查图标是否有效 if icon.isNull(): # print(f"跳过无效图标: {standard_icon.name}") continue pixmap_32 = icon.pixmap(32, 32) # 生成 32x32 的 QPixmap icon_32 = QIcon(pixmap_32) # 重新创建 QIcon name = standard_icon.name # 获取图标名称 icon_panel = self.create_icon(panel, icon_32, name) icon_layout.addWidget(icon_panel) i += 1

 

在图标展示后,每个图标都在接收单击事件后,传入对象的相关信息,因此选中并确认后返回图标的信息。

def on_item_selected(self, event, name: str): """鼠标左键单击事件处理""" icon = get_bitmap(name, self.return_icon_size) bitmap = icon.pixmap(32, 32) bitmap = bitmap.scaled(32, 32, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) self.selected_name = name self.selected_bitmap = bitmap self.bmpCtrl.setPixmap(bitmap) print(f"你选择了: {name}")

 

这样我们就可以根据名称进行图标的展示了。

我们在bitmap_util.py的辅助类中定义获取图标为位图对象QIcon的转换,如下是根据名称生成对应的位图对象QIcon。

def get_bitmap(name: str, icon_size: int = 32) -> QIcon: """获取位图,可以根据名称获取images里面的内容,或者是系统内置的图标SP_XXX""" if name is None or name == "": name = "appIcon" if name.startswith("SP_"): # 系统内置的图标 icon = get_standard_icon(name, icon_size) return icon elif name.startswith("ic_fluent_"): # 微软Fluent系统图标 icon = FluentSystemIconUtil.create_icon_by_name(name, icon_size) return icon else: # 自定义内置的图标 icon = get_customed_icon_with_default(name, icon_size) return icon

 

以上就是基于PySide6/PyQt6的前端应用中,对自定义的图标资源以及内置图标资源进行整合的展示处理,以及如何生成base64编码,加载显示图标的一整个过程。

 

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/20344.html

    分享给朋友:

    “使用PySide6/PyQt6实现系统图标的展示和选择处理” 的相关文章

    RackNerd主机服务评测:高性价比与卓越客户体验

    RackNerd是一家自2019年成立以来便迅速崛起的美国主机商。每当我想起这家公司,心中总是浮现出他们以高性价比著称的形象。初次接触时,我对他们的服务种类印象深刻:虚拟主机、VPS主机、独立服务器和服务器托管等。这些服务能满足不同行业和客户的需求,尤其是对预算有限的小型企业或创业者而言,RackN...

    便宜VPS的选择与使用指南,帮你找到高性价比服务器

    便宜VPS的定义与概述 在讨论便宜VPS之前,我们先了解一下什么是VPS。VPS的全称是“虚拟专用服务器”,它实际上是一种将物理服务器划分成多个虚拟服务器的技术。每个VPS拥有独立的操作系统和资源,相当于拥有自己的私人服务器。这意味着,你可以自由安装软件、配置设置,像使用独立服务器一样使用VPS,但...

    UCloud年付100元的云服务选择与优势解析

    在开始探讨UCloud的计费方式之前,我想先分享一下我对云服务费用的一些理解和看法。在如今的数字化时代,选择合适的云服务提供商至关重要,计费方式也应兼顾灵活性和经济性。我在UCloud上体验过不同的计费方式,从中得出了一些实用的建议。 UCloud提供的计费方式相当多样,特别是在按年计费这一块。对于...

    深度解析韩国makemodel:传统与现代结合的时尚理念

    markdown格式的内容 韩国makemodel概念 谈到韩国makemodel,我首先感受到了它所传递的深厚文化底蕴。这一时尚理念融合了传统与现代,不仅仅是对衣物的设计,更是一种对韩国文化的致敬。它通过巧妙的配搭,将历史悠久的韩服元素与现代流行趋势相结合,创造出一种独特的美学风格。每一件作品都像...

    如何在Vultr上添加适合的充值金额和选择合适的VPS方案

    Vultr概述 Vultr是一家在云服务领域颇有声誉的公司,它以提供高性能的虚拟专用服务器(VPS)而闻名。Vultr不仅在全球范围内拥有多个数据中心,还以其灵活的方案和易于扩展的功能,赢得了众多用户的青睐。在激烈的市场竞争中,Vultr凭借其合理的价格和优化的服务流程,使自己脱颖而出,成为许多个人...

    如何利用VPS优惠码省钱并提升服务体验

    在互联网上,虚拟专用服务器(VPS)已经成为许多个人和企业的首选方案之一。VPS允许用户拥有一个独立的、完全可控的服务器环境,同时又节省了许多硬件投资成本。对于那些刚开始接触VPS的朋友来说,了解VPS的定义及其用途是非常重要的。在这里,VPS不仅仅是一个存储空间,它能为你的业务提供强大的运算能力和...