2010-01-20 2 views
7

1) Я хочу получить имя папки для приложения для мониторинга папки. Есть ли способ, чтобы я мог отфильтровывать определенные папки от отображения с помощью QFileDialog (например, я не хочу, чтобы мои документы были отображается в диалоговом окне файла).qfiledialog - Фильтрация папок?

2) Я не хочу, чтобы пользователь выбирал диск. По умолчанию в этом коде диски также могут быть выбраны ..

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

Есть ли способ, что я могу серые диски или какие-то определенные папки, так что он не может быть выбран или могу я установить фильтры для папки чтобы предотвратить его появление.

ответ

1

Вы можете попробовать использовать фильтр QDir.Dirs.

dialog = QtGui.QFileDialog(parentWidget) 

dialog.setFilter(QDir.Dirs) 
+0

Благодарим за ваш ответ. Но он перечислит все каталоги. Здесь я хочу перечислить только каталоги патрициев. Этот код также делает то же самое. Мой вопрос Как фильтр расширения файлов есть ли какой-либо фильтр для каталогов? И еще один вопрос заключается в том, что кнопка «ok в qfiledialog» может быть отключена, когда пользователь выбирает директорию для обучения. – Jeba

8

Вы можете попробовать установить модель прокси для вашего диалога файла: QFileDialog::setProxyModel. В классе прокси-модели переопределите метод filterAcceptsRow и верните false для папок, которые вы не хотите показывать. Ниже приведен пример того, как может выглядеть прокси-модель; it'c C++, сообщите мне, есть ли проблемы с преобразованием этого кода в python. Эта модель, как предполагается, чтобы отфильтровать файлы и показывать только папки:

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

вот как я звала его

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

Обратите внимание, что модель прокси поддерживается только диалогами неродных файлов.

1

serge_gubenko дал вам верный ответ. Вам нужно было проверить имена папок и вернуть «false» для тех, которые не должны отображаться. Например, чтобы отфильтровать любые папки с именем «частный», вы должны написать:

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

Я уже тестировал это, и он отлично работает. serge_gubenko должен получить должный кредит.

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