Фильтрация в QFileDialog - PullRequest
       30

Фильтрация в QFileDialog

5 голосов
/ 04 февраля 2011

Я бы хотел отфильтровать файлы, которые отображаются в QFileDialog более конкретно, чем просто по расширениям файлов. Примеры, которые я нашел в документации Qt, показывают только фильтры типа Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml) и тому подобное. В дополнение к этому я также хотел бы указать фильтр для файлов, который должен не отображаться в диалоговом окне файлов, например, XML files (*.xml) но не Backup XML files (*.backup.xml).

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

Например:

Файлы для отображения:

file1.xml  
file2.xml

Файлы, которые не отображаются:

file1.backup.xml  
file2.backup.xml

Я хотел бы спросить, возможно ли определить такие фильтры для QFileDialog?

Ответы [ 3 ]

9 голосов
/ 04 февраля 2011

Я верю, что вы можете сделать это:

  1. Создание собственной модели прокси. Вы можете использовать QSortFilterProxyModel в качестве базового класса для вашей модели;
  2. В прокси-модели переопределите метод filterAcceptsRow и верните false для файлов, в именах которых есть ". Backup." ;
  3. Установить новую модель прокси в диалоговом окне файла: QFileDialog :: setProxyModel ;

Ниже приведен пример:

Модель прокси:

class FileFilterProxyModel : public QSortFilterProxyModel
{
protected:
    virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
};

bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
    QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
    QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel());
    return fileModel->fileName(index0).indexOf(".backup.") < 0;
    // uncomment to call the default implementation
    //return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent);
}
Диалог

был создан следующим образом:

QFileDialog dialog;
dialog.setProxyModel(new FileFilterProxyModel);
dialog.setNameFilter("XML (*.xml)");
dialog.setOption(QFileDialog::DontUseNativeDialog);
dialog.exec();

Модель прокси поддерживается только не родными диалоговыми окнами файлов.

1 голос
/ 28 ноября 2017

Решение @serge_gubenko работает хорошо. Создайте свой собственный ProxyModel, унаследовав от QSortFilterProxyModel.

class FileFilterProxyModel : public QSortFilterProxyModel
{
protected:
    virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
};

bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
    // Your custom acceptance condition
    return true;
}

Обязательно установите DontUseNativeDialog перед настройкой модели Proxy (не так, как это сделал @serge_gubenko). Собственные диалоги не поддерживают пользовательские ProxyModel s.

QFileDialog dialog;
dialog.setOption(QFileDialog::DontUseNativeDialog);
dialog.setProxyModel(new FileFilterProxyModel);
dialog.setNameFilter("XML (*.xml)");
dialog.exec();

Мне потребовалось довольно много времени, чтобы выяснить это. Это было написано здесь

0 голосов
/ 14 октября 2014

Хорошо, я использовал его с QFileDialog объектом.И это только показывает мне файлы, перечисленные в соответствующем каталоге.Прекрасно просто выбрать файлы для обработки.Например, файл XML, изображение в формате PNG и так далее.

Здесь я представляю мой пример

 OlFileDialog QFileDialog (this); 
 QString slFileName; 
 olFileDialog.setNameFilter (tr ("Files (* xml)")); 
 olFileDialog.setFileMode (QFileDialog :: anyfile); 
 olFileDialog.setViewMode (QFileDialog :: Detail); 
 if (olFileDialog.exec ()) 
     olFileDialog.selectFile (slFileName); 
 else 
     return; 

В диалоговом окне отображаются только файлы XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...