Фильтрация в 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?


person Bitjuggler    schedule 03.02.2011    source источник


Ответы (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.setOption(QFileDialog::DontUseNativeDialog);
dialog.setProxyModel(new FileFilterProxyModel);
dialog.setNameFilter("XML (*.xml)");
dialog.exec();

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

person serge_gubenko    schedule 04.02.2011
comment
Как отмечено ниже miile7, setOption(QFileDialog::DontUseNativeDialog); нужно вызывать перед setProxyModel(). Протестировано с Qt 5.11 - person truf; 18.10.2018

Решение @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 перед настройкой модели прокси (Изменить: ответ @serge_gubenkos делает это сейчас). Собственные диалоги не поддерживают пользовательские ProxyModel.

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

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

person miile7    schedule 28.11.2017

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

person White Hat Hacker    schedule 13.10.2014