Russian Qt Forum
Ноябрь 24, 2024, 19:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отображение файлов  (Прочитано 10401 раз)
kirill
Гость
« : Январь 26, 2009, 08:50 »

Здравствуйте.

Хочу отображать в QTreeView только файлы некой директории.

Делаю модель:
Код
C++ (Qt)
  fsModel_ = new FileSystemModel();
  fsModel_->setFilter(QDir::Files | QDir::Hidden);
 

Делаю TreeView
Код
C++ (Qt)
  //Представление в виде дерева
  fileTreeView_ = new QTreeView();
  fileTreeView_->setRootIsDecorated(false);
  fileTreeView_->setAlternatingRowColors(true);
  fileTreeView_->setAnimated(false);
  fileTreeView_->setIndentation(20);
  fileTreeView_->setSortingEnabled(true);
  fileTreeView_->sortByColumn(0, Qt::AscendingOrder);
 

Связываю:
Код
C++ (Qt)
fileTreeView_->setModel(fsModel_);
 

Задаю директорию в слоте, который потом будет вызываться по нажатию батона.
Код
C++ (Qt)
void MainWindow::changeDirectory(const QString & newPath)
{
 fsModel_->setRootPath(newPath);
 fileTreeView_->setRootIndex(fsModel_->index(newPath));
}
 

Вроде бы работает, но!
Допустим у меня есть папка с вложенными: (вложение 1)


Мой код нормально отображает только файлы из этой папки.
Теперь я через слот changeDirectory задаю подпапку исходной.
Тоже отображается нормально - т.е. только файлы.
Следующим шагом я задаю исходную папку через слот, т.е. возвращаюсь к исходной.
И вот тут получается косяк - отображаются файлы и к ним вдобавок папка, которая была на предыдущем шаге, т.е. подпапка.
Во вложениях я постарался изобразить эту ситуацию.

Что не так у меня сделано? Почему начинают отображаться субпапки, почему кладется болт на установленный setFilter(QDir::Files) ? К тому же отображаются не все папки, а только посещенная. Help me!
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Январь 26, 2009, 12:15 »

Такой вопросец, а вы смотрели на QDirModel?

Код
C++ (Qt)
QDirModel *model = new QDirModel;
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);
tree->setRootIndex(model->index(QDir::currentPath()));
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kirill
Гость
« Ответ #2 : Январь 26, 2009, 12:40 »

Такой вопросец, а вы смотрели на QDirModel?

Код
C++ (Qt)
QDirModel *model = new QDirModel;
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);
tree->setRootIndex(model->index(QDir::currentPath()));

Ну я использую QFileSystemModel. Не думаю что между ними большая разница.
А как ваш пост поможет мне решить проблему?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Январь 26, 2009, 12:57 »

Ну я использую QFileSystemModel. Не думаю что между ними большая разница.

В вашем первом посте указана FileSystemModel, поэтому я предположил что это ваша модель, а не кутишная. Поэтому и посоветовал попробовать воспользоваться QDirModel
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kirill
Гость
« Ответ #4 : Январь 26, 2009, 13:00 »

oh, shit.

Не заметил. Да, но я просто унаследовался от нее, а функционал можно считать неизменным.
Записан
developer
Гость
« Ответ #5 : Январь 26, 2009, 13:49 »

Цитировать
Не заметил. Да, но я просто унаследовался от нее, а функционал можно считать неизменным.
Не всегда, для корректной работи нужно правильно переопределить некоторые методи, какие именно нужно смотреть в базовом классе, ето часто помогает
Записан
kirill
Гость
« Ответ #6 : Январь 26, 2009, 14:14 »

Да нет, все гораздо проще.
Давайте считать, что наследования нету и используется чистая QFileSystemModel.

Собственно непонятно, почему модель так странно себя ведет.
Если бы у меня был фильтр setFilter(QDir::AllDirs) я бы даже не спрашивал ничего, т.к. в этом случае работает все хорошо. Но я же хочу только список файлов, т.е. фильтр QDir::Files.

А тут такой косяк - влезают директории, хотя четко прописан фильр.
Записан
ритт
Гость
« Ответ #7 : Январь 26, 2009, 19:20 »

написал тестовое приложение - действительно, похоже на багу Qt. нужно протестировать под 4.5-snapshot - там было множество коммитов в QFileSystemModel.
как протестирую под снапшотом, отпишусь.
Записан
ритт
Гость
« Ответ #8 : Январь 26, 2009, 20:36 »

бага осталась. kirill, если есть желание, чтобы исправление попало в 4.5, создавай таску в трекере - приложи минимальный компилябельный пример. когда ответят и присвоят баге публичный номерок, этот номерок сюда.
я в свободное время пороюсь в коде - поищу багу. если найду, отправлю патч к существующей таске - это поможет слегка ускорить процесс.
Записан
ритт
Гость
« Ответ #9 : Январь 27, 2009, 04:03 »

так-с, за багу это уже не примут, максимум - за недостаточно чёткое документирование.
Цитировать
void QFileSystemModel::setFilter ( QDir::Filters filters )

Sets the directory model's filter to that specified by filters.

Note that the filter you set should always include the QDir::AllDirs enum value, otherwise QFileSystemModel won't be able to read the directory structure.

судя по коду, просто не предполагалось, что QFileSystemModel будет использоваться только для отображения файлов. если папка единожды была прочитана, она со всем содержимым кэшируется в списке известных файлов, а это непременно означает, что любое последующее перечисление в модель папки, расположенной на уровень выше данной, повлечёт включение известной папки в список видимых файлов (т.к. закешированные данные не проходят фильтрацию снова, а информация о папке не проходила фильтрацию и в первый раз - папка была принудительно указана в качестве корневой /* сами понимаете, если сразу отфильтровать корневой элемент, модель останется пустой */)

kirill, попробуй достаточно ёмко мотивировать выбор именно в пользу QFileSystemModel, а не QDirModel. если имеются веские причины, будем развивать тему далее...
Записан
kirill
Гость
« Ответ #10 : Январь 27, 2009, 05:41 »

Подозреваю, что косяк именно в моей реализации, не зря я эту тему разместил в вопросах новичков )).
По поводу обязательного включения в фильтр AllDirs - та же фраза есть и для QDirModel. То есть получается, что используя эти модели невозможно отобразить только файлы не прибегая к прокси моделям.
Выбор в пользу QFileSystemModel был сделан из-за того, что в этой модели установка setFilter(QDir::Files)  стала работать и отображать только файлы. QDirModel на этот фильтр не обращал внимания.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.161 секунд. Запросов: 23.