Russian Qt Forum

Qt => Model-View (MV) => Тема начата: QCasper от Ноябрь 02, 2007, 11:48



Название: QDirModel или откуда берутся значки файлов и папок?
Отправлено: QCasper от Ноябрь 02, 2007, 11:48
Если установить экземпляр QDirModel в качестве модели в экземпляр QTreeView, то в этом вью можно будет наблюдать всю иерархию файлов и папок также как в проводнике. Я собираюсь создать несколько упрощенный вариант такой модели (+некоторые изменения), единственный вопрос, который меня интересует это как сделать так, чтобы все мои файлы и папки отображались с соответствующими значками. Другими словами, как это реализовано в QDirModel? Может быть кто-то сразу знает, неохота исходники рыть :-[


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: QCasper от Ноябрь 02, 2007, 11:57
Всё, разобрался, прошу прощения за поспешный пост. Но все же, если вдруг кто столкнется, то см. QFileIconProvider.


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: WW от Ноябрь 02, 2007, 12:35
Спасибо! Как раз бился над тем, как выдернуть ассоциированую файлу иконку.


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: crossly от Ноябрь 07, 2007, 18:32
гм..... QFileIconProvider отображает иконки только винды и мак..... а кто подскажет как в линукс....??


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: pastor от Ноябрь 07, 2007, 19:01
гм..... QFileIconProvider отображает иконки только винды и мак..... а кто подскажет как в линукс....??

А можно поинтересоваться, откуда такие данные. В ассистенте я не нашёл (может плохо искал конечно :) )


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: QCasper от Ноябрь 07, 2007, 19:46
откуда какие именно данные? Класс QFileIconProvider? У меня Qt 4.3.2 - в асистанте есть.


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: pastor от Ноябрь 07, 2007, 21:06
откуда какие именно данные? Класс QFileIconProvider? У меня Qt 4.3.2 - в асистанте есть.

Помоему вопрос crossly стоял об отображениее иконок, насколько я понял, в линукс через данный класс. Вопрос не стоял о наличии класса. И мне стало непонято, откуда такие данные, что  QFileIconProvider отображает иконки только винды и мак. Что собственно говоря происходит по линуксом? Соответственно, в ассистанте я не нашёл никаких ограничение, что касаеться платформы, для этого класса.


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: QCasper от Ноябрь 08, 2007, 01:04
А понял теперь, просто сначала я вообще вопрос crossly не заметил, и никак вообще не пойму причем тут маки, вины и линуксы :)


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: crossly от Ноябрь 09, 2007, 21:01
поясняю.... дело тут не просто в иконке.... а в иконке ассоциированной с файлом... к примеру в винде я по иконке могу определить что файл к примеру принадлежит msword ну и т.д. .... понятное дело что в гноме и кде это дело реализовано по разному.... но собственно интерисует кде...


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: pastor от Ноябрь 09, 2007, 21:22
Непонятен вопрос.... Что не так с QFileIconProvider про который вы говорили?


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: crossly от Ноябрь 10, 2007, 19:06
а дело в самой иконке.... в винде например я по иконке могу определить что это файл msword а линухе нет.... т.е. в линухе видно только файл это или каталог... ну или ссылка...


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: ритт от Ноябрь 10, 2007, 19:18
дык, назначение/определение привязок - это уже задача графической оболочки

если хочешь то же самое под линухами, надо пользовать, к примеру, КФайлДиалог вместо КуФайлДиалог'а


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: crossly от Ноябрь 10, 2007, 19:21
ну енто то само собой понятно.... просто нужна кроссплатформенность.... поэтому К не покатит... т.е. что бы в винде свои иконки... в КДЕ свои...


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: Вячеслав от Ноябрь 10, 2007, 19:26
ну для линукса можно попытаться file позвать и посмотреть чего оно скажет ..... Но это делать надо руками (IMHO )в отличии от  форточек... Но опять-таки IMHO это честнее - кто мне мешает криво файл под форточками обозвать ? file.pdf.doc например .. И что будут окна с таким делать - запущать ворд или акробата ? В общем - в линуксе приходящие файлы для импорта в нашу систему прогонялись через file и в соответствии с его рекомендациями прогонялись через фильтры ;) Пока работает четко ....
PS на расширения файла естественно не смотрим - вояки оччень любят ( для секретности наверное ;D ) doc или ртф как *.txt притаскивать .....


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: fox от Ноябрь 10, 2007, 20:28
Судя по исходникам береться из QStyle->standardIcon()
Далие уже береться pixmap из конкретного стиля, например из QPlastiqueStyle() а там если посмотреть ищется в kdeешных (но для данного стиля)
Для того же QCleanlooksStyle ищет в gnomeвских иконках


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: crossly от Ноябрь 13, 2007, 19:36
где ты говоришь ищется...?? ::)


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: ритт от Ноябрь 13, 2007, 22:17
присоединяюсь к вячеславу
через file будет честно и надёжно

ежели так не нравится (не хочется ручками работать), под лялихами биндь к кде


Название: Re: QDirModel или откуда берутся значки файлов и папок?
Отправлено: fox от Ноябрь 13, 2007, 23:56
где ты говоришь ищется...?? ::)
Ну если я правильно разобрал исходники то получается следующая вещь (если где то неправ поправьте)
QFileIconProvider содержит в себе QFileIconProviderPrivate в котором содержаться все картинки
Они береться из стиля (это для Linux для Win и Mac так есть специфичные методы кроме этого)
Код:
    
QStyle * style = QApplication::style();
file = style->standardIcon(QStyle::SP_FileIcon);
Далее уже в QStyle из standardIcon() вызывается standardIconImplementation() причем standardIconImplementation() должен быть слотом и вызывается не напрямую а через QMetaObject::invokeMethod() Сами тролтехи в документации это объясняют следующем образом
Цитировать
Warning: Because of binary compatibility constraints, this function is not virtual. If you want to provide your own icons in a QStyle subclass, reimplement the standardIconImplementation() slot in your subclass instead. The standardIcon() function will dynamically detect the slot and call it.
Из standardIconImplementation() дергается
Код:
virtual QPixmap standardPixmap ( StandardPixmap standardPixmap, const QStyleOption * option = 0, const QWidget * widget = 0 ) const = 0
Соответственно standardPixmap() уже определённом стиле
Там уже определены имена файлов откуда брать иконки плюс метод lookupIconTheme() насколько я понял используется для поиска иконок
В стиле QPlastiqueStyle проверяется путь "/usr/share/icons/default.kde"
В QCleanlooksStyle в соответствующем месте для gnome
Далее уже для каждого зарезервированного типа грузиться с иконка из соответствующего файла
Например для стандартной иконке SP_DirIcon в QPlastiqueStyle ищется файл folder.png Для QCleanlooksStyle gnome-fs-directory.png
и тд