Qt之QFileIconProvider(获取文件图标、类型)

Qt中获取系统图标、类型是通过QFileIconProvider来实现的,具体如下:

 第一种方法是获取已经存在本地的文件的图标

 第二种方法是根据文件名称(不管本地是否存在该文件)获取系统默认图标

一、Qt获取系统文件图标

1、获取文件夹图标

 QFileIconProvider icon_provider;

 QIcon icon = icon_provider.icon(QFileIconProvider::Folder);

 

2、获取指定文件图标

QFileInfo file_info(name);
QFileIconProvider icon_provider;
QIcon icon = icon_provider.icon(file_info);

 

二、Windows编程中获取系统图标、类型:

QIcon Setting::getFileIcon(QString file_name)
{
 QIcon file_icon = QIcon(":/icon/file");
 if(!file_name.isEmpty())
 {
  //获取后缀
  std::string str = "file";
  int index =file_name.lastIndexOf(".");
  if(index >= 0)
  {
   QStringsuffix = file_name.mid(index); 

   //将QString转化为std::string
   str =suffix.toUtf8().constData(); //std::string((const char*)path.toLocal8Bit())  path.toLatin1().data();
  }

  LPCSTR name =str.c_str();

  
  SHFILEINFOA info;
  if(SHGetFileInfoA(name,
   FILE_ATTRIBUTE_NORMAL,
   &info,
   sizeof(info),
   SHGFI_SYSICONINDEX| SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))
  {
   HICON icon =info.hIcon;
   file_icon =QIcon(QPixmap::fromWinHICON(icon));
  }
 }

 return file_icon;
}

 

QString Setting::getFileType(QString file_name)
{
 QString file_type = QString("file");
 if(!file_name.isEmpty())
 {
  //获取后缀
  std::string str = "file";
  int index =file_name.lastIndexOf(".");
  if(index >= 0)
  {
   QStringsuffix = file_name.mid(index); 

   //将QString转化为std::string
   str =suffix.toUtf8().constData();
  }

  LPCSTR name =str.c_str();

  
  SHFILEINFOA info;
  if(SHGetFileInfoA(name,
   FILE_ATTRIBUTE_NORMAL,
   &info,
   sizeof(info),
   SHGFI_TYPENAME| SHGFI_USEFILEATTRIBUTES))
  {
   std::stringtype = info.szTypeName;
   file_type =type.c_str();
  }
 }

 return file_type;
}

 

QIcon Setting::getFolderIcon()
{
 QIcon folder_icon = QIcon(":/icon/folder");

 //将QString转化为std::string
 std::string str = "folder";
 LPCSTR name = str.c_str();

 
 SHFILEINFOA info;
 if(SHGetFileInfoA(name,
  FILE_ATTRIBUTE_DIRECTORY,
  &info,
  sizeof(info),
  SHGFI_SYSICONINDEX | SHGFI_ICON| SHGFI_USEFILEATTRIBUTES))
 {
  HICON h_icon = info.hIcon;

  folder_icon =QIcon(QPixmap::fromWinHICON(h_icon)); 
 }

 return folder_icon;
}

 

QString Setting::getFolderType()
{
 QString folder_type = QString("folder");
 std::string str = "folder";
 LPCSTR name = str.c_str();

 
 SHFILEINFOA info;
 if(SHGetFileInfoA(name,
  FILE_ATTRIBUTE_DIRECTORY,
  &info,
  sizeof(info),
  SHGFI_TYPENAME |SHGFI_USEFILEATTRIBUTES))
 {
  std::string type =info.szTypeName;
  folder_type =type.c_str();
 }

 return folder_type;
}

 

效果图:

Qt之QFileIconProvider(获取文件图标、类型)

 

   两种方式最大的区别是什么呢?

    可以参考这篇文章—QFileIconProvider, Getting icon for non-existentfile (based onextension)!诸如所言,Qt所提供的获取图标的方法是本地已存在的文件,如果要通过扩展名来获取图标则需要自己来虚拟构造本地文件,而在数据量较大的情况下往往会影响性能。这(通过扩展名获取图标、类型)可以通过WindowsAPI来实现,即方法二。


更多参考:


注:
   技术在于交流、沟通,转载请注明出处并保持作品的完整性。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值