使用PySide/PyQt实现系统图标的展示和选择处理
使用PySide/PyQt实现系统图标的展示和选择处理引言在桌面应用程序开发中图标是提升用户体验的重要元素。Python的PySide/PyQt库提供了强大的图形界面工具其中QFileIconProvider类可以轻松获取操作系统中的图标资源。本文将详细讲解如何利用PySide/PyQt实现系统图标的展示与选择功能帮助你构建更直观的文件管理或资源选择界面。## 核心组件QFileIconProviderQFileIconProvider是Qt框架中用于获取文件图标的类它能够根据文件类型、扩展名或系统设置返回对应的图标。通过这个类我们可以- 获取任意文件的图标- 获取文件夹、驱动器等系统对象的图标- 支持自定义图标类型## 基础实现获取并显示系统图标首先让我们通过一个简单的示例来展示如何获取系统图标并显示在界面上。这个示例将创建一个窗口显示常见文件类型的图标。pythonimport sysfrom PySide6.QtWidgets import (QApplication, QMainWindow, QListWidget, QListWidgetItem, QVBoxLayout, QWidget)from PySide6.QtGui import QIcon, QFileIconProviderfrom PySide6.QtCore import QFileInfoclass IconDemoWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(系统图标展示示例) self.setGeometry(100, 100, 400, 300) # 创建中心部件和布局 central_widget QWidget() self.setCentralWidget(central_widget) layout QVBoxLayout(central_widget) # 创建列表控件用于显示图标 self.list_widget QListWidget() layout.addWidget(self.list_widget) # 创建图标提供器 self.icon_provider QFileIconProvider() # 添加示例文件图标 self.add_icon_items() def add_icon_items(self): 添加各种文件类型的图标到列表 # 定义要展示的文件类型列表使用常见的文件扩展名 file_types [ (文本文件, .txt), (图片文件, .jpg), (PDF文档, .pdf), (压缩文件, .zip), (可执行文件, .exe), (文件夹, ), # 空字符串表示文件夹 ] for name, ext in file_types: # 创建QFileInfo对象用于获取图标 if ext : # 文件夹使用系统临时目录 file_info QFileInfo(/tmp) else: # 文件类型通过扩展名创建虚拟文件 file_info QFileInfo(fexample{ext}) # 获取图标 icon self.icon_provider.icon(file_info) # 创建列表项并添加图标和文字 item QListWidgetItem(icon, name) self.list_widget.addItem(item)if __name__ __main__: app QApplication(sys.argv) window IconDemoWindow() window.show() sys.exit(app.exec())这段代码演示了如何通过QFileIconProvider获取不同文件类型的系统图标。注意我们通过创建虚拟的QFileInfo对象来模拟不同类型的文件从而获取对应的图标。运行后你会看到文本文件、图片文件等都有各自独特的系统图标。## 进阶实现文件选择器中的图标应用在实际应用中我们经常需要在文件选择器中显示图标。下面的示例实现了一个自定义文件选择器用户双击文件可以获取其路径和图标信息。pythonimport sysfrom PySide6.QtWidgets import (QApplication, QMainWindow, QListWidget, QListWidgetItem, QVBoxLayout, QWidget, QLabel, QHBoxLayout, QPushButton, QFileDialog)from PySide6.QtGui import QIcon, QFileIconProvider, QPixmapfrom PySide6.QtCore import QFileInfo, Qtclass FileSelectorWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(系统图标选择器) self.setGeometry(100, 100, 500, 400) # 创建图标提供器 self.icon_provider QFileIconProvider() # 创建中心部件 central_widget QWidget() self.setCentralWidget(central_widget) main_layout QVBoxLayout(central_widget) # 添加按钮区域 button_layout QHBoxLayout() self.select_btn QPushButton(选择文件) self.select_btn.clicked.connect(self.select_files) button_layout.addWidget(self.select_btn) self.clear_btn QPushButton(清空列表) self.clear_btn.clicked.connect(self.clear_list) button_layout.addWidget(self.clear_btn) main_layout.addLayout(button_layout) # 文件列表 self.list_widget QListWidget() self.list_widget.itemDoubleClicked.connect(self.show_file_info) main_layout.addWidget(self.list_widget) # 信息显示区域 self.info_label QLabel(双击文件查看详细信息) self.info_label.setAlignment(Qt.AlignCenter) main_layout.addWidget(self.info_label) def select_files(self): 打开文件选择对话框添加文件到列表 files, _ QFileDialog.getOpenFileNames( self, 选择文件, , 所有文件 (*) ) for file_path in files: file_info QFileInfo(file_path) icon self.icon_provider.icon(file_info) # 创建列表项存储完整路径 item QListWidgetItem(icon, file_info.fileName()) item.setData(Qt.UserRole, file_path) # 存储文件路径 self.list_widget.addItem(item) def clear_list(self): 清空文件列表 self.list_widget.clear() self.info_label.setText(列表已清空) def show_file_info(self, item): 双击文件时显示详细信息 file_path item.data(Qt.UserRole) file_info QFileInfo(file_path) # 获取图标并转换为QPixmap用于显示 icon self.icon_provider.icon(file_info) pixmap icon.pixmap(64, 64) # 获取64x64的图标 # 构建信息文本 info_text f 文件: {file_info.fileName()} 路径: {file_path} 大小: {file_info.size() / 1024:.1f} KB 类型: {file_info.suffix()} self.info_label.setText(info_text)if __name__ __main__: app QApplication(sys.argv) window FileSelectorWindow() window.show() sys.exit(app.exec())这个进阶示例实现了完整的文件选择功能- 点击选择文件按钮可以打开系统文件对话框选择任意文件- 选中的文件会显示在列表中并自动获取对应的系统图标- 双击列表中的文件可以查看文件的详细信息包括名称、路径、大小和类型## 技术要点解析### 1. QFileIconProvider的工作原理QFileIconProvider通过查询操作系统的文件关联信息来返回图标。它支持以下图标类型-IconType.Normal普通文件图标-IconType.Folder文件夹图标-IconType.Drive驱动器图标-IconType.Network网络位置图标### 2. 图标缓存机制每次调用icon()方法时Qt内部会进行图标缓存避免重复从操作系统获取相同类型的图标提高性能。### 3. 跨平台兼容性PySide/PyQt的图标功能在不同操作系统Windows、macOS、Linux上都能正常工作会自动适配各系统的图标主题。## 总结本文详细介绍了如何使用PySide/PyQt的QFileIconProvider类来实现系统图标的展示和选择处理。通过两个实际代码示例我们学习了1. 基础图标获取与显示方法2. 文件选择器中的图标应用技巧3. 图标信息的提取与展示QFileIconProvider是开发文件管理器、资源浏览器或任何需要文件图标功能的应用程序的重要工具。它简化了跨平台图标获取的复杂性让开发者能够专注于业务逻辑同时为用户提供原生的视觉体验。在实际项目中你可以进一步扩展这些功能比如添加图标预览大小调整、实现拖拽选择、或者结合线程技术处理大量文件的图标加载。掌握这些技术将帮助你创建出更加专业和用户友好的桌面应用程序。

相关新闻

GitHub开源深度评测|1.6万星爆火!hallmark:消灭AI味的设计质量管控体系,前端AI编码的质量门禁

GitHub开源深度评测|1.6万星爆火!hallmark:消灭AI味的设计质量管控体系,前端AI编码的质量门禁

GitHub开源深度评测|1.6万星爆火!hallmark:消灭AI味的设计质量管控体系,前端AI编码的质量门禁项目星级:16.6k Stars 核心定位:面向AI编码助手的反同质化设计技能系统,主打AI生成视觉内容的质量控…

2026/7/26 23:00:13阅读更多 →
AI学术写作助手:全流程智能解决方案

AI学术写作助手:全流程智能解决方案

1. 项目概述:当学术写作遇上AI助手去年指导本科生论文时,我发现一个有趣现象:80%的咨询问题都集中在格式调整、文献引用和查重降重这些基础环节。这促使我开始思考——能否用技术手段把学者们从重复劳动中解放出来?"书匠策AI…

2026/7/26 23:00:13阅读更多 →
软件:STM32-F1系列-TIM定时器介绍(2026/6/29)

软件:STM32-F1系列-TIM定时器介绍(2026/6/29)

目录 时钟来源简介 时基单元: 输出比较: 一、什么叫输出比较(Output Compare) 二:一个具体的时基例子来介绍输出比较 三:OC输出比较控制了gpio的输出电平 四:定时器中输出比较的几种模式 (1)Frozen (2)Active(置高电平) (3)Inactive(置低电平) (4…

2026/7/26 23:00:13阅读更多 →
【JAVA毕设源码分享】基于SpringBoot与Vue.js的健康管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot与Vue.js的健康管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:28:31阅读更多 →
Linux pwd命令详解:原理、技巧与应用场景

Linux pwd命令详解:原理、技巧与应用场景

1. 为什么我们需要pwd命令在Linux系统中工作时,我们经常需要确认自己当前所处的目录位置。想象一下你正在一个陌生的城市里行走,突然想给朋友发送自己的当前位置——这时候你就需要查看地图定位。pwd命令就是Linux系统中的这个"定位器"&#x…

2026/7/27 0:28:31阅读更多 →
放飞炬人集团行政总裁方达炬批准筹备   宇航工业公司 专门大规模高质量制造轰炸机、强人工智能战斗机、宇航器、全隐身运输机、战斗无人机、空天飞机、光子通信侦察机、拦截卫星轨道导弹攻击机。

放飞炬人集团行政总裁方达炬批准筹备 宇航工业公司 专门大规模高质量制造轰炸机、强人工智能战斗机、宇航器、全隐身运输机、战斗无人机、空天飞机、光子通信侦察机、拦截卫星轨道导弹攻击机。

放飞炬人集团行政总裁方达炬批准筹备 宇航工业公司 专门大规模高质量制造轰炸机、强人工智能战斗机、宇航器、全隐身运输机、战斗无人机、空天飞机、光子通信侦察机、拦截卫星轨道导弹攻击机。

2026/7/27 0:28:31阅读更多 →
鸿蒙动态化UI方案:低代码渲染引擎/JSON-DSL解析驱动UI/模板热更新架构设计与落地

鸿蒙动态化UI方案:低代码渲染引擎/JSON-DSL解析驱动UI/模板热更新架构设计与落地

一、前置思考 传统客户端开发中,UI的每次修改都需要重新编译、打包、发版、用户更新。在运营活动频繁、A/B实验迭代快的场景下,这个流程完全无法满足业务需求。动态化UI方案提供了一种思路:UI逻辑由服务端下发,客户端渲染引擎解析…

2026/7/27 0:28:31阅读更多 →
5分钟快速上手:Windows本地实时语音转文字工具TMSpeech终极指南

5分钟快速上手:Windows本地实时语音转文字工具TMSpeech终极指南

5分钟快速上手:Windows本地实时语音转文字工具TMSpeech终极指南 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 你是否经常需要将会议录音、在线课程或视频内容转换为文字?是否担心隐私泄露&…

2026/7/27 0:28:31阅读更多 →
手机号码定位查询系统:3分钟快速部署的完整指南

手机号码定位查询系统:3分钟快速部署的完整指南

手机号码定位查询系统:3分钟快速部署的完整指南 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirrors/lo…

2026/7/27 0:26:31阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/26 0:01:28阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/26 0:01:28阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/26 0:01:28阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →