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)
  {
   QString suffix = 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)
  {
   QString suffix = 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::string type = 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-existent file (based on extension)!諸如所言,Qt所提供的獲取圖標的方法是本地已存在的文件,如果要通過擴展名來獲取圖標則需要自己來虛擬構造本地文件,而在數據量較大的情況下往往會影響性能。這(通過擴展名獲取圖標、類型)可以通過Windows API來實現,即方法二。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章