获取特定文件类型的关联图标

文件系统相关类

要处理文件系统相关功能,一般直接使用Python 标准库中的函数,Qt 包含的以下几个类,只需要简单了解。

  • QFileSystemModel 是一个管理本地文件系统的类,比如说创建目录,删除文件等等。他是一个模型类,继承自 QAbstractItemModel ,因此可以被视图使用。
  • QDir 是一个管理目录的类,比如创建新目录,获取路径分隔符等等;
  • QFile 是一个管理文件的类,比如删除、复制文件等等。
  • QFileInfo 是一个管理文件信息的类,比如文件是否可读写、最后的修改事件、权限信息等等。

获取文件类型关联图标

要获取特定文件类型的关联图标,需要使用到 QFileIconProvider 类,这个类主要提供了一个 icon(...) 函数,可以得到 QIcon 对象

icon(...) 函数接收两种类型的参数

  • icon(IconType) 返回系统图标
  • icon(QFileInfo) 返回特定文件的关联图标

IconType 枚举类型

IconType 是个枚举类型,有以下几种值:

  • QFileIconProvider::Computer 电脑
  • QFileIconProvider::Desktop 桌面
  • QFileIconProvider::Trashcan 回收站
  • FileIconProvider::Network 网络
  • QFileIconProvider::Drive 驱动器
  • QFileIconProvider::Folder 文件夹
  • QFileIconProvider::File 文件

将图标对象保存为文件

得到 QIcon 对象以后:

  • 可以直接在程序中使用
  • 不能直接保存为文件,好在 QIcon 提供了一个 pixmap(w, h) 函数,可以将 QIcon 转换为 QPixmap ,而 QPixmap 对象可以保存为文件。

临时文件

QFileInfo 对象需要一个真正存在的文件才能正确创建,我们使用 QTemporaryFile 创建各种类型的临时文件,传给 QFileInfo 。

使用临时文件可能出现的问题

临时文件对象 QTemporaryFile 只在运行范围内有效,一旦脱离了运行范围,文件将会被删除,QFileInfo 也不能获取正确的文件信息,导致不能解析出图标。

注意事项

QFileIconProvider 需要 QApplication 支持,因此,需要实例化一个 QApplication 对象,得到图标并保存以后,调用 quit() 方法退出即可

案例代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
这个程序可以获取系统图标以及指定的文件类型图标,并将他们保存为文件
"""

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.Qt import *


def saveIcon(icon, filename, w=32, h=32):
    pixmap = icon.pixmap(w, h)
    # ico 类型好像不能超过 32*32
    pixmap.save('icons\\' + filename + '.ico')


def getIcon():
        # 系统图标
    icontype = {0: "Computer", 1: "Desktop", 2: "Trashcan",
                3: "Network", 4: "Drive", 5: "Folder", 6: "File"}

    # 特定文件类型
    filetype = ['txt', 'doc', 'docx', 'ppt', 'pptx',
                'xls', 'xlsx', 'pdf', 'exe', 'zip', 'rar', 'mp4']

    # 图标提供者,主要靠他获取图标
    provider = QFileIconProvider()

    for i in range(7):
        icon = provider.icon(i)
        saveIcon(icon, icontype[i])

    for ext in filetype:
        # 创建临时文件
        f = QTemporaryFile('temp_XXXXXX.' + ext)
        # 打开文件才真正创建
        f.open()
        # 关闭临时文件不会真正删除,直到脱离运行上下文,因此可以关闭
        f.close()

        # QFileInfo 需要一个真正的文件,这里把临时文件给他
        fi = QFileInfo(f)

        icon = provider.icon(fi)
        saveIcon(icon, ext)


if __name__ == '__main__':
    # 需要一个 QApplication ,QaFileIconProvider 才能使用
    app = QApplication(sys.argv)
    getIcon()
    app.quit()

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,476评论 25赞 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,180评论 19赞 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 16,771评论 4赞 61
  • 送走德安吉洛·拉塞尔这笔交易至今看来做得很棒: 他们清理了每年要拿1600万美金却根本派不上什么用场的蒂莫菲·莫兹...
    饭特稀情报局阅读 613评论 0赞 1
  • 至从阅读了《学习之道》这本书之后,知道了构建组块的方法,一直很想在自己心中也把知识构建成组块,把一块块散落的砖建立...
    阑十三阅读 672评论 0赞 13

友情链接更多精彩内容