2010-01-20 23 views
7

1) Je souhaite obtenir le nom du dossier d'un dossier de surveillance d'application. Existe-t-il un moyen de filtrer l'affichage de dossiers spécifiques à l'aide de QFileDialog (Par exemple, je ne veux pas que mes documents soient affiché dans la boîte de dialogue)qfiledialog - Dossiers de filtrage?

2) Je ne souhaite pas que l'utilisateur sélectionne un lecteur. Par défaut, dans ce code lecteurs peuvent également être sélectionnés ..

dirname=QtGui.QFileDialog.getExistingDirectory(self,'Open Directory','c:\\',QtGui.QFileDialog.ShowDirsOnly) 
print(dirname) 

Est-il possible que je peux gris les lecteurs ou certains dossiers spécifiques de sorte qu'il ne peut pas être sélectionné ou que je peux définir les filtres pour le dossier pour éviter de l'afficher.

Répondre

1

Vous pouvez essayer d'utiliser le filtre QDir.Dirs.

dialog = QtGui.QFileDialog(parentWidget) 

dialog.setFilter(QDir.Dirs) 
+0

Merci apt pour votre réponse. Mais il va lister tous les répertoires .. Ici, je veux lister seulement les répertoires patriculaires .. Le code ci-dessus fait également la même .. Ma question est Comme filtre d'extension de fichier est-il un filtre pour les répertoires ?? Et une autre question est la façon dont le "bouton ok dans qfiledialog" peut être désactivé lorsque l'utilisateur sélectionne un répertoire patriculaire. – Jeba

8

Vous pouvez essayer de définir un modèle de proxy pour votre boîte de dialogue de fichier: QFileDialog::setProxyModel. Dans la classe de modèle proxy, remplacez la méthode filterAcceptsRow et renvoyez false pour les dossiers que vous ne souhaitez pas afficher. Voici un exemple de la façon dont le modèle de proxy peut ressembler; c'est C++, faites moi savoir s'il y a des problèmes pour convertir ce code en python. Ce modèle est censé filtrer les fichiers et afficher uniquement les dossiers:

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

    if (fileModel!=NULL && fileModel->isDir(index0)) 
    { 
     qDebug() << fileModel->fileName(index0); 
     return true; 
    } 
    else 
     return false; 
    // uncomment to execute default implementation 
    //return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); 
} 

est ici comment je l'appeler

QFileDialog dialog; 
FileFilterProxyModel* proxyModel = new FileFilterProxyModel; 
dialog.setProxyModel(proxyModel); 
dialog.setOption(QFileDialog::DontUseNativeDialog); 
dialog.exec(); 

Notez que le modèle proxy est pris en charge par les boîtes de dialogue de fichier non natif uniquement.

1

serge_gubenko vous a donné la bonne réponse. Vous avez seulement dû vérifier les noms de dossier et retourner "faux" pour ceux qui ne devraient pas être affichés. Par exemple, pour filtrer tous les dossiers nommés « privé » vous écririez:

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

    if (fileModel!=NULL && fileModel->isDir(index0)) 
    { 
     qDebug() << fileModel->fileName(index0); 
     if (QString::compare(fileModel->fileName(index0), tr("private")) == 0) 
      return false; 

     return true; 
    } 
    else 
     return false; 
    // uncomment to execute default implementation 
    //return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); 
} 

Je l'ai déjà testé cela et il fonctionne parfaitement. serge_gubenko devrait recevoir tout le crédit dû.