2011-01-06 2 views
4

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

ВОПРОС:

Как я могу каким-то образом получить QIcon из системы с использованием Qt SDK

Спасибо.

ответ

8

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

+6

Просто маленький отзыв производительности. Если вам нужно предоставить эти значки очень часто, создайте один локальный экземпляр QFileIconProvider. Конструкция QFileIconProvider тяжелая –

0

С 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; 
} 
0

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

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

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

Смежные вопросы