Qt 之 QFileIconProvider (生成文件icon)

项目场景:

项目有个小需求,需要遍历文件夹中的所有文件,并且以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; 
}

你可能感兴趣的:(《Qt,项目实战经历全记录》,qt,QFileIcon,文件图标)