2010-01-20 139 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应该收到所有应有的信用。