Qt4.8-QFileIconProvider,获取不存在文件的图标(基于扩展名)
我目前正在尝试根据文件扩展名获取图标,但QFileIconProvider似乎只会在实际可以读取现有文件时返回图标。有什么方法可以让我得到一个基于文件扩展名的QIcon吗?另一种方法是编写一个具有所需扩展名的临时文件,但这非常低效,因此我正在寻找解决方法Qt4.8-QFileIconProvider,获取不存在文件的图标(基于扩展名),qt,filesystems,qtgui,Qt,Filesystems,Qtgui,我目前正在尝试根据文件扩展名获取图标,但QFileIconProvider似乎只会在实际可以读取现有文件时返回图标。有什么方法可以让我得到一个基于文件扩展名的QIcon吗?另一种方法是编写一个具有所需扩展名的临时文件,但这非常低效,因此我正在寻找解决方法 任何帮助都将不胜感激 以下是我的Windows解决方案: iconprovider.h: class IconProvider { public: static IconProvider * instance(); static
任何帮助都将不胜感激 以下是我的Windows解决方案: iconprovider.h:
class IconProvider
{
public:
static IconProvider * instance();
static QIcon fileIcon(const QString &filename);
static QIcon dirIcon();
private:
IconProvider() {}
private:
static IconProvider *self;
QPixmapCache iconCache;
QFileIconProvider iconProvider;
};
iconprovider.cpp:
IconProvider *IconProvider::self = 0;
IconProvider *IconProvider::instance()
{
if(!self)
self = new IconProvider();
return self;
}
QIcon IconProvider::fileIcon(const QString &filename)
{
QFileInfo fileInfo(filename);
QPixmap pixmap;
#ifdef Q_OS_WIN32
if (fileInfo.suffix().isEmpty() || fileInfo.suffix() == "exe" && fileInfo.exists())
{
return instance()->iconProvider.icon(fileInfo);
}
if (!instance()->iconCache.find(fileInfo.suffix(), &pixmap))
{
// Support for nonexistent file type icons, will reimplement it as custom icon provider later
/* We don't use the variable, but by storing it statically, we
* ensure CoInitialize is only called once. */
static HRESULT comInit = CoInitialize(NULL);
Q_UNUSED(comInit);
SHFILEINFO shFileInfo;
unsigned long val = 0;
val = SHGetFileInfo((const wchar_t *)("foo." + fileInfo.suffix()).utf16(), 0, &shFileInfo,
sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES);
// Even if GetFileInfo returns a valid result, hIcon can be empty in some cases
if (val && shFileInfo.hIcon)
{
pixmap = QPixmap::fromWinHICON(shFileInfo.hIcon);
if (!pixmap.isNull())
{
instance()->iconCache.insert(fileInfo.suffix(), pixmap);
}
DestroyIcon(shFileInfo.hIcon);
}
else
{
// TODO: Return default icon if nothing else found
}
}
#else
// Default icon for Linux and Mac OS X for now
return instance()->iconProvider.icon(fileInfo);
#endif
return QIcon(pixmap);
}
QIcon IconProvider::dirIcon()
{
return instance()->iconProvider.icon(QFileIconProvider::Folder);
}
如果有Qt,为什么要使用WinApi函数?@Blood Qt没有API来获取不存在的文件(即文件类型)的图标。我只是使用了QTemporaryFile,然后在临时文件上使用了QFileIconProvider。这样它就可以保持平台独立性。有点低效,但可能是唯一的方法。@Brad Yep,这是一个可能的解决方案,但在大数据集的情况下要注意性能问题。@Brad,Oleg:保留文件扩展名到QICON的哈希映射,这样您只需为应用程序关心的每个扩展名创建一个临时文件,怎么样?