文件系统相关类
要处理文件系统相关功能,一般直接使用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()