Как показать только папки с конкретными файлами, используя QTreeView и QFileSystemModel? - PullRequest
3 голосов
/ 06 марта 2012

У меня проблема с фильтрацией определенной папки с использованием QTreeView и QFileSystemModel.

Я установил свой корневой QFileSystemModel в определенную папку - это работает. Но я хочу показать только папки, которые содержат .jpg файлы. Возможно ли это?

Я фильтрую .jpg файлы, и это работает, но мой QTreeView показывает все папки, даже те, которые не имеют .jpg файлов. Поэтому, если пользователь пытается открыть какую-либо папку без файлов .jpg, ничего не происходит.

Как я могу скрыть эти папки?

Примечание: ниже есть часть кода.

QStringList filterTypeFile;
filterTypeFile.append("*.jpg");
this->m_pModelTreeViewImage->setNameFilters(filterTypeFile);
this->m_pModelTreeViewImage->setNameFilterDisables(false);

this->ui->treeViewImages->setModel(this->m_pModelTreeViewImage);

Ответы [ 2 ]

4 голосов
/ 06 марта 2012

Плохие новости, я боюсь: вам придется реализовать это самостоятельно, если вы хотите такого поведения.Считыватели файловой системы просто не настроены на подобные вещи.

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

Также учтите: установленный шаблон для этого - только скрывать файлы и никогда не скрывать каталоги.Это, вероятно, является результатом технических трудностей, описанных выше, но это стало стандартным поведением пользовательского интерфейса.Поэтому, если пользователь сталкивается с программой просмотра файловой системы, которая не показывает все ожидаемые им папки (или если он не может открыть определенные папки, на первый взгляд наугад), он может предположить, что что-то сломано.

Тем не менее, если в любом случае есть веская причина, вы можете переопределить QFileSystemModel, чтобы делать то, что вы хотите (или, в противном случае, вы можете заставить подкласс AbstractModel вести себя так, как вы описали).Ваши пользователи будут акклиматизироваться, особенно если есть веская причина для нового поведения.

Удачи!

0 голосов
/ 07 октября 2012

Вы должны наследовать от QSortFilterProxyModel и переопределить функцию virtual bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const.Примерно так

bool JPGFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
   QFileSystemModel *fs = static_cast<QFileSystemModel*>(sourceModel());
   QModelIndex i = fs->index(source_row, 0, source_parent);
   bool accept=false;
   if( fs->hasChildren(i) ){
     for( int j=0; j<fs->rowCount(i); j++  )
       if( fs->fileInfo(fs->index(j,0,i)).suffix()=="jpg" ){
         accept=true;
         break;
       }
   }
   return accept;
}

Я сам не пробовал.Это медленно, но должно работать.

...