2017-02-02 3 views
0

Я хотел бы отобразить диалоговое окно открытия файла, которое фильтрует по определенному шаблону, например *.000 - *.999.Регулярный фильтр выражения для QFileDialog

QFileDialog::getOpenFileNames позволяет определить дискретные фильтры, такие как *.000, *.001 и т.д. Я хотел бы установить регулярное выражение в качестве фильтра, в этом случае ^.*\.\d\d\d$, т.е. любого имени файла, который имеет расширение трехзначный.

ответ

0

ariwez указал мне в правильном направлении. Главное, на что нужно обратить внимание, - позвонить dialog.setOption(QFileDialog::DontUseNativeDialog)доdialog.setProxyModel.

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

class FileFilterProxyModel : public QSortFilterProxyModel 
{ 
protected: 
    virtual bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const 
    { 
     QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); 
     QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel()); 

     // I don't want to apply the filter on directories. 
     if (fileModel == nullptr || fileModel->isDir(index0)) 
      return true; 

     auto fn = fileModel->fileName(index0); 

     QRegExp rx(".*\\.\\d\\d\\d"); 
     return rx.exactMatch(fn); 
    } 
}; 

Диалог создается файл следующим образом:

QFileDialog dialog; 

// Call setOption before setProxyModel. 
dialog.setOption(QFileDialog::DontUseNativeDialog); 
dialog.setProxyModel(new FileFilterProxyModel); 
dialog.exec(); 
1

Это можно сделать, добавив прокси-модель в QFileDialog. Здесь объясняется: Filtering in QFileDialog

+0

Согласно документации Qt, это должно работать. Я выполнил инструкции в приведенной выше ссылке, однако 'filterAcceptsRow' подкласса никогда не вызывается. – Frank

+0

Я должен добавить, что я использую Qt 5.4.1, Win 10 и VS 2013. – Frank

+0

Ну, с Qt5 и VS dialog.setProxyModel (& filter) не работает - и dialog.proxyModel() остается нулевым, поэтому фильтрация не выполняется , – ariwez

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