Хорошо, я, кажется, столкнулся с ситуацией, когда мне нужно пройти по моим каталогам и искать только файлы .mp3 и .mpeg. После поиска я хочу отобразить их в виде дерева.
По сути, в моем приложении 2 вида дерева, один отображает системные каталоги, а другой должен отображать только файлы .mp3 и .mpeg.
Вот код
// Gets called when application starts
void DetailView::onCamStartup()
{
m_SystemModel = new QFileSystemModel(this);
m_SystemListViewModel = new QFileSystemModel(this);
m_SystemModel->setRootPath(QDir::currentPath());
ui->DriveView->setModel(m_SystemModel);
ui->DriveListView->setModel(m_SystemListViewModel);
// regard less how many columns you can do this using for:
for(int nCount = 1; nCount < m_SystemModel->columnCount(); nCount++)
ui->DriveView->hideColumn(nCount);
}
// Displays Files in Detail View on Clicking Drive
void DetailView::on_DriveView_clicked(const QModelIndex &index)
{
QString sPath = m_SystemModel->fileInfo(index).absoluteFilePath();
ui->DriveListView->setRootIndex(m_SystemListViewModel->setRootPath(sPath));
m_SystemModel->setRootPath(QDir::currentPath());
m_SystemModel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs );
m_SystemListViewModel->setFilter( QDir::Files | QDir::NoDotAndDotDot );
QStringList m_list;
QDirIterator dirIt(sPath,QDirIterator::Subdirectories);
while (dirIt.hasNext())
{
dirIt.next();
if (QFileInfo(dirIt.filePath()).isFile())
{
if (QFileInfo(dirIt.filePath()).suffix() == "mp3" || QFileInfo(dirIt.filePath()).suffix() == "mpeg")
{
qDebug()<<dirIt.filePath();
m_list<<dirIt.filePath();
m_list.append(dirIt.filePath());
}
}
m_SystemListViewModel->setNameFilters(m_list);
m_SystemListViewModel->setNameFilterDisables(false);
}
}
где DriveView
это дерево, которое отображает диски и DriveListView
это древовидная структура, которая должна отображать только файлы mp3 и mpeg. Когда я отлаживаю код, qDebug()<<dirIt.filePath();
дает мне путь ко всем файлам .mp3 и .mpeg в Application Output
вкладка, но не отображает их внутри DriveListView (древовидное представление). На данный момент он отображает только файлы на диске, но подпапки на диске также имеют файлы mp3, которые не отображаются.
Вот картинка для справки:
Обратите внимание, что внутри SONGS есть много папок, в которых присутствуют mp3-файлы, но они не отображаются.
Где я делаю ошибку ???
Для меня это выглядит как призыв к
m_SystemListViewModel->setFilter( QDir::Files | QDir::NoDotAndDotDot );
явно скажет Qt только показывать файлы.
Согласно документации, Вы должны просто пройти QDir::AllDirs
с вашими предыдущими фильтрами.
QDir :: AllDirs — список всех каталогов; не применять фильтры к именам каталогов.
Может быть, попытаться использовать не QFileSystemModel
на ваш m_SystemListViewModel
, но создайте свою собственную модель, которая наследует QAbstractItemModel
и использовать QStyledItemDelegate
над ним.