Фильтрация в 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 ответа
Я верю, что вы можете сделать это:
- Создайте собственную модель прокси. Вы можете использовать QSortFilterProxyModel в качестве базового класса для вашей модели;
- В модели прокси переопределите метод filterAcceptsRow и верните false для файлов, имеющих ".backup". слово в их именах;
- Установите новую модель прокси в диалоговом окне файла: 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). Собственные диалоги не поддерживают пользовательские ProxyModel
s.
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.