我正在开发一个应用程序,需要显示与不同文件类型相关联的图标。例如,对于.doc扩展名,我需要它能够显示Microsoft Word图标。
问题: 如何使用QT sdk从系统中获取QIcon?
谢谢。
问题: 如何使用QT sdk从系统中获取QIcon?
谢谢。
QMimeDatabase mime_database;
QIcon icon_for_filename(const QString &filename)
{
QIcon icon;
QList<QMimeType> mime_types = mime_database.mimeTypesForFileName(filename);
for (int i=0; i < mime_types.count() && icon.isNull(); i++)
icon = QIcon::fromTheme(mime_types[i].iconName());
if (icon.isNull())
return QApplication::style()->standardIcon(QStyle::SP_FileIcon);
else
return icon;
}
如果您没有特别的要求,QMimeDatabase
是您需求的更好选择。我建议您尝试@nitro2005的答案。您仍然可以使用QFileIconProvider
手动完成此工作。
如果您想手动完成这项工作,但由于某些原因无法使用QMimeDatabase
,则有一种适用于Linux/X11的解决方案。您可以使用QFileInfo(const QString& file)
获取文件的后缀/扩展名(不必关心您传递给QFileInfo
构造函数的QString是否为现有路径),然后从该后缀获取MIME类型,最后使用QIcon::fromTheme
获取QIcon即可完成操作。
例如,以下代码将检查文件的后缀是否为“.bin”,如果是,则从系统主题中以“application-x-executable”MIME类型给它一个图标。实际上,只是自己维护MIME数据库。
QString fileName("example.bin");
QFileInfo fi(fileName);
if (fi.suffix().compare(QString("bin")) == 0) {
item->setIcon(QIcon::fromTheme("application-x-executable",
provider.icon(QFileIconProvider::File)));
}
要获取您的“MIME数据库”的MIME类型字符串参考,请查看freedesktop图标命名规范。
QFileIconProvider
的构造成本很高,因为缓存以前不会在多个实例之间共享。然而,在 Qt 5.8 中似乎已经改变了。它现在使用例如QWindowsTheme
的缓存,这个缓存在所有实例之间共享。 - Georg Schölly