项目场景:
项目有个小需求,需要遍历文件夹中的所有文件,并且以listview或listwidget来展示文件列表,展示内容有文件图标、文件名称、大小等信息,名称大小信息容易获得,文件图标如何展示?其实Qt早就为你准备好了
QFileIconProvider :
QFileIconProvider类为QDirModel和QFileSystemModel类提供了文件图标,用法非常简单,局限是只能针对本地文件
enum QFileIconProvider::IconType
Constant | Value |
---|---|
QFileIconProvider::Computer | 0 |
QFileIconProvider::Desktop | 1 |
QFileIconProvider::Trashcan | 2 |
QFileIconProvider::Network | 3 |
QFileIconProvider::Drive | 4 |
QFileIconProvider::Folder | 5 |
QFileIconProvider::File | 6 |
获得本地文件icon
QString fileToIcon(const QUrl &url)
{
QFileIconProvider provider;
QFileInfo info = QFileInfo(fileName);
QIcon icon = provider.icon(info);
QPixmap image = QPixmap(icon.pixmap(32, 32));
image.save(info.fileName() + "_icon.png", "PNG");
return info.fileName() + "_icon.png";
}
通过扩展名获得文件icon
QIcon FileIcon::fileExtensionIcon(const QString & extension) const
{
QFileIconProvider icon_provider;
QIcon icon;
QTemporaryFile tmp_file(QDir::tempPath() + QDir::separator() +
QCoreApplication::applicationName() + "_XXXXXX" + extension);
tmp_file.setAutoRemove(false);
if(tmp_file.open())
{
QString file_name = tmp_file.fileName();
tmp_file.write(QByteArray());
tmp_file.close();
icon = icon_provider.icon(QFileInfo(file_name));
tmp_file.remove();
}
else
{
qCritical()<<QString("failed to write temporary file %1") .arg(tmp_file.fileName());
}
通过扩展名获得类型
QString fileExtensionType(const QString & extension) const
{
QFileIconProvider icon_provider;
QString type;
QTemporaryFile tmp_file(QDir::tempPath() + QDir::separator() +
QCoreApplication::applicationName() + "_XXXXXX" + extension);
tmp_file.setAutoRemove(false);
if(tmp_file.open())
{
QString file_name = tmp_file.fileName();
tmp_file.write(QByteArray());
tmp_file.close();
type = icon_provider.type(QFileInfo(file_name));
tmp_file.remove();
}
else
{
qCritical()<<QString("failed to write temporary file %1") .arg(tmp_file.fileName());
}
return type;
}