如何通过文件扩展名获取Qt图标(QIcon)

7
我正在开发一个应用程序,需要显示与不同文件类型相关联的图标。例如,对于.doc扩展名,我需要它能够显示Microsoft Word图标。
问题: 如何使用QT sdk从系统中获取QIcon?
谢谢。
3个回答

11

7
小性能提示:如果您需要经常提供这些图标,请创建一个QFileIconProvider的本地实例。QFileIconProvider的构造非常耗费资源。 - Kamil Klimek
看起来 QFileIconProvider 的构造成本很高,因为缓存以前不会在多个实例之间共享。然而,在 Qt 5.8 中似乎已经改变了。它现在使用例如 QWindowsTheme 的缓存,这个缓存在所有实例之间共享。 - Georg Schölly

3
自Qt5以来,使用QMimeDatabase进行此操作:
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;
}

fromTheme 只在 Linux 上可用,是吗? - ManuelSchneid3r

0

如果您没有特别的要求,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图标命名规范


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接