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

感謝您的回覆。但它會列出所有的目錄..在這裏,我只想列出心室目錄..上面的代碼也做同樣的..我的問題是像文件擴展名過濾器是否有任何目錄過濾器?還有一個問題是,當用戶選擇心室目錄時,可以禁用「qfiledialog中的OK按鈕」。 – Jeba 2010-01-22 16:19:14

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應該收到所有應有的信用。

相關問題