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

Я хотел бы отфильтровать файлы, которые отображаются в 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 ответа

Решение

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

  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();

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

Решение @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). Собственные диалоги не поддерживают пользовательские ProxyModels.

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

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

Хорошо, я использовал это с объектом 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.

Другие вопросы по тегам