Как получить значок Qt (QIcon) с расширением файла - PullRequest
5 голосов
/ 06 января 2011

Я занимаюсь разработкой приложения, которое должно отображать значки, связанные с различными типами файлов .
Например, для расширений .doc , мне нужно, чтобы оно могло отображать Значок Microsoft Word .

ВОПРОС:

Как я могу каким-то образом получить QIcon из системы, используя QT sdk

Спасибо.

Ответы [ 3 ]

9 голосов
/ 06 января 2011

Используйте класс QtGui.QFileIconProvider .

0 голосов
/ 23 августа 2017

Если у вас нет особых требований, QMimeDatabase - лучший выбор для ваших нужд. Я рекомендую вам попробовать ответ @ nitro2005. Вы все еще можете выполнить эту работу вручную, используя QFileIconProvider.

Если вы хотите выполнить эту работу своими руками, но по какой-то причине вы не можете использовать QMimeDatabase, есть решение, работающее для Linux / X11. Вы можете использовать QFileInfo(const QString &file) для получения суффикса / расширения файла (не обязательно, если QString, который вы передали конструктору QFileInfo, является существующим путем или нет), а затем получите форму MIME-типа с суффиксом. получить QIcon с помощью QIcon::fromTheme, и все готово.

Например, следующий код проверит, является ли суффикс файла «.bin», если есть, присваивает ему значок из системной темы с типом MIME «application-x-исполняемый». На самом деле это просто ведение базы данных 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 .

0 голосов
/ 17 августа 2017

Начиная с 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;
}
...