2011-02-03 4 views
5

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

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

Например:

Файлы показать:

file1.xml 
file2.xml 

Файлы не показывать:

file1.backup.xml 
file2.backup.xml 

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

ответ

9

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

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

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

Proxy модель: диалог

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

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

0

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

0

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

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

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

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (https://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/18085257) –

Смежные вопросы