Russian Qt Forum

Qt => Model-View (MV) => Тема начата: maydyk от Июль 31, 2009, 12:11



Название: Модель для просмотра одной папки
Отправлено: maydyk от Июль 31, 2009, 12:11
Привет! В Qt я новичок и сразу столкнулся с проблемой. Нужно обеспечить просмотр содержимого папки в QListView. Опыты с QFileSystemModel и QDirModel к результату не привели. Какую модель выбрать и как получить список файлов в одной папке?


Название: Re: Модель для просмотра одной папки
Отправлено: m_ax от Июль 31, 2009, 12:23
Оч просто  :)

У класса QDir есть метод
Код
C++ (Qt)
QStringList entryList ( Filters filters = NoFilter, SortFlags sort = NoSort ) const
 

Получаете список всего что нужно в интересующей вас папке и засовываете его в QListWidget и всё  ;)


Название: Re: Модель для просмотра одной папки
Отправлено: maydyk от Июль 31, 2009, 15:13
Но тогда я получу просто список файлов, а мне нужен "explorer-like" виджет, с иконками и т.п.


Название: Re: Модель для просмотра одной папки
Отправлено: pastor от Июль 31, 2009, 15:23
А что именно не получилось с QFileSystemModel?


Название: Re: Модель для просмотра одной папки
Отправлено: maydyk от Июль 31, 2009, 15:48
А что именно не получилось с QFileSystemModel?

Непонятно как указать директорию для отображения. Какой-бы путь я не передавал в setRootPath(), всё время отображается список дисков, т.е. корень файловой системы. Метода для "перехода" в указанную директорию я не нашел.


Название: Re: Модель для просмотра одной папки
Отправлено: ритт от Июль 31, 2009, 15:53
Код:
const QModelIndex root = model->setRootPath(newDirectory);
view->setRootIndex(root);


Название: Re: Модель для просмотра одной папки
Отправлено: maydyk от Июль 31, 2009, 16:03
Код:
const QModelIndex root = model->setRootPath(newDirectory);
view->setRootIndex(root);

Супер! Спасибо, заработало. Жаль только иногда "прорываются" папки несмотря на вызов setFilter(QDir::Files).


Название: Re: Модель для просмотра одной папки
Отправлено: ритт от Август 01, 2009, 17:31
а присутствует в фильтре System и/или Hidden?


Название: Re: Модель для просмотра одной папки
Отправлено: maydyk от Август 04, 2009, 12:44
Эх, продолжаются мучения :) Подскажите плз, можно-ли при использованиии QListView и QFileSystemModel отображать не все файлы в директории, а только часть по известному фильтру?

Казалось правильным решением было использование QSortFilterProxyModel и вызове метода setFilterWildcard(), но не тут-то было! Фильтр применяется не только к файлам, но и ко всем папкам. В результате невозможно получить индекс для вызова QListView::setRootItem() -- путь к папке в модели отсутствует, он отфильтрован.


Название: Re: Модель для просмотра одной папки
Отправлено: ритт от Август 05, 2009, 02:45
QFileSystemModel::setNameFilters


Название: Re: Модель для просмотра одной папки
Отправлено: maydyk от Август 05, 2009, 10:21
QFileSystemModel::setNameFilters
К сожалению этот метод даёт нежелательный эффект: через фильтр "прорываются" ранее посещённые директории несмотря на вызов setFilter(QDir::Files).


Название: Re: Модель для просмотра одной папки
Отправлено: ритт от Август 05, 2009, 10:34
нельзя QDir::Files
QDirModel и QFileSystemModel кешируют всё-подряд - без разбора. поэтому фильтр должен быть как минимум QDir::Dirs или (QDir::Dirs | QDir::Files)
так что, если нужны только файлы, проще всего будет навесить проксю, отфильтровывающую папки. но при этом setNameFilters всё-равно эффективнее (хотя бы внутренний мап прокси будет меньше)