2010-01-20 3 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

답장을 보내 주셔서 감사합니다. 하지만 그것은 모든 디렉토리를 나열합니다 .. 여기 patricular 디렉토리를 나열하고 싶습니다 .. 위의 코드도 동일 않습니다 .. 내 질문은 파일 확장자 필터와 마찬가지로 디렉토리에 대한 필터가 무엇입니까 ?? 그리고 한 가지 다른 질문은 사용자가 patricular 디렉토리를 선택할 때 "qfiledialog의 ok 버튼"이 비활성화 될 수있는 방법입니다. – Jeba

8

파일 대화 상자에 프록시 모델을 설정해보십시오. QFileDialog::setProxyModel. 프록시 모델 클래스에서 filterAcceptsRow 메서드를 재정 의하여 표시하지 않으려는 폴더에 대해 false를 반환합니다. 아래는 프록시 모델의 모습입니다. it'c C++,이 코드를 Python으로 변환하는 데 문제가 있는지 알려주십시오. 이 모델은 폴더에 파일을 필터링하고 표시하도록되어 : 나는 프록시 모델이 아닌 기본 파일 대화 상자에서만 지원됩니다 그것을

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

주를 호출 된 방법

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

여기입니다.

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는 모든 신용을 받아야합니다.