2017-02-02 7 views
0

Je souhaite afficher une boîte de dialogue d'ouverture de fichier qui filtre un motif particulier, par exemple *.000 à *.999.Filtre d'expressions régulières pour QFileDialog

QFileDialog::getOpenFileNames vous permet de spécifier des filtres discrets, tels que *.000, *.001, etc. Je voudrais définir une expression régulière comme un filtre, dans ce cas ^.*\.\d\d\d$, à savoir un nom de fichier qui a une extension à trois chiffres.

Répondre

0

ariwez m'a pointé dans la bonne direction. La principale chose à surveiller est d'appeler dialog.setOption(QFileDialog::DontUseNativeDialog)avantdialog.setProxyModel.

Le modèle proxy est:

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

La boîte de dialogue de fichier est créé comme suit:

QFileDialog dialog; 

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

Cela peut être fait en ajoutant un modèle de proxy à QFileDialog. Il est expliqué ici: Filtering in QFileDialog

+0

Selon la documentation Qt, cela devrait fonctionner. J'ai suivi les instructions dans le lien ci-dessus, cependant, 'filterAcceptsRow' de la sous-classe n'est jamais appelé. – Frank

+0

Je devrais ajouter que j'utilise Qt 5.4.1, Win 10 et VS 2013. – Frank

+0

Eh bien, avec Qt5 et VS dialog.setProxyModel (& filter) ne fonctionne pas - et dialog.proxyModel() reste null donc aucun filtrage n'est fait . – ariwez