一、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;
}
效果圖:
兩種方式最大的區別是什麼呢?
可以參考這篇文章—QFileIconProvider, Getting icon for non-existent file (based on extension)!諸如所言,Qt所提供的獲取圖標的方法是本地已存在的文件,如果要通過擴展名來獲取圖標則需要自己來虛擬構造本地文件,而在數據量較大的情況下往往會影響性能。這(通過擴展名獲取圖標、類型)可以通過Windows API來實現,即方法二。