2010-01-20 7 views
7

1) Ich möchte den Namen des Ordners für eine Ordnerüberwachung Anwendung bekommen. Gibt es eine Möglichkeit, dass ich bestimmte Ordner aus der Anzeige mit QFileDialog herausfiltern kann (Zum Beispiel möchte ich nicht die meine Dokumente sein im Dateidialog angezeigt).qfiledialog - Ordner filtern?

2) Ich möchte nicht, dass der Benutzer ein Laufwerk auswählt. Standardmäßig in diesem Code-Laufwerke auch ausgewählt werden können ..

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

Gibt es eine Möglichkeit, dass ich die Laufwerke graut oder einige bestimmte Ordner, so dass sie nicht ausgewählt werden kann oder habe ich den Filter für Ordner um zu verhindern, dass es angezeigt wird.

Antwort

1

Sie können versuchen, mit QDir.Dirs Filter.

dialog = QtGui.QFileDialog(parentWidget) 

dialog.setFilter(QDir.Dirs) 
+0

Vielen Dank für Ihre Antwort. Aber es wird alle Verzeichnisse auflisten .. Hier möchte ich nur die patrikulären Verzeichnisse auflisten .. Der obige Code tut auch das gleiche .. Meine Frage ist wie Dateierweiterung Filter gibt es einen Filter für Verzeichnisse? Und noch eine Frage gibt es eine Möglichkeit, die "OK-Taste in qfiledialog" kann deaktiviert werden, wenn der Benutzer ein patrikuläres Verzeichnis wählt. – Jeba

8

Sie können versuchen, ein Proxy-Modell für Ihren Dateidialog festzulegen: QFileDialog::setProxyModel. Überschreiben Sie in der Proxy-Modellklasse die filterAcceptsRow-Methode und geben Sie false für Ordner zurück, die nicht angezeigt werden sollen. Im Folgenden finden Sie ein Beispiel dafür, wie ein Proxy-Modell aussehen kann. it'c C++, lassen Sie mich wissen, wenn es Probleme gibt, diesen Code in Python zu konvertieren. Dieses Modell soll Dateien herauszufiltern und zeigen nur Ordner:

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

hier ist, wie ich es nennen

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

Beachten Sie, dass der Proxy-Modell nur durch nicht-native Dateidialoge unterstützt wird.

1

serge_gubenko gab Ihnen die richtige Antwort. Sie mussten nur die Ordnernamen überprüfen und "falsch" für diejenigen zurückgeben, die nicht angezeigt werden sollten. Um beispielsweise Ordner mit dem Namen "privat" herauszufiltern, würden Sie schreiben:

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

Ich habe das bereits getestet und es funktioniert perfekt. serge_gubenko sollte alle fälligen Kredit erhalten.