Qt之QFileIconProvider(获取文件图标、类型)
2013-06-14 10:06阅读:
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;
}
效果图:
两种方式最大的区别是什么呢?
可以参考这篇文章—
QFileIconProvider, Getting icon for non-existent
file (based on
extension)!诸如所言,Qt所提供的获取图标的方法是本地已存在的文件,如果要通过扩展名来获取图标则需要自己来虚拟构造本地文件,而在数据量较大的情况下往往会影响性能。这(通过扩展名获取图标、类型)可以通过Windows
API来实现,即方法二。
更多参考:
注:
技术在于交流、沟通,转载请注明出处并保持作品的完整性。
作者:╰☆奋斗ing❤孩子` 原文:http://blog.sina.cn/dpool/blog/s/blog_a6fb6cc90101dx99.html?vt=4。