qfiledialog - 过滤文件夹?

Jeb*_*eba 7 qt pyqt qfiledialog

1)我想获取文件夹监视应用程序的文件夹名称.有没有办法可以过滤掉使用QFileDialog显示的特定文件夹(例如我不希望我的文档显示在文件对话框)..

2)我不希望用户选择驱动器.默认情况下,此代码中也可以选择驱动器..

dirname=QtGui.QFileDialog.getExistingDirectory(self,'Open Directory','c:\\',QtGui.QFileDialog.ShowDirsOnly)
print(dirname)
Run Code Online (Sandbox Code Playgroud)

有没有办法,我可以灰色驱动器或某些特定的文件夹,以便它无法选择或我可以设置文件夹的过滤器,以防止显示它..

ser*_*nko 8

您可以尝试为文件对话框设置代理模型:QFileDialog :: setProxyModel.在代理模型类中,重写filterAcceptsRow方法,并为不希望显示的文件夹返回false.下面是代理模型的外观示例; 它是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);
}
Run Code Online (Sandbox Code Playgroud)

这就是我的称呼方式

QFileDialog dialog;
FileFilterProxyModel* proxyModel = new FileFilterProxyModel;
dialog.setProxyModel(proxyModel);
dialog.setOption(QFileDialog::DontUseNativeDialog);
dialog.exec();
Run Code Online (Sandbox Code Playgroud)

请注意,仅非非本机文件对话框支持代理模型.


apt*_*apt 1

您可以尝试使用 QDir.Dirs 过滤器。

dialog = QtGui.QFileDialog(parentWidget)

dialog.setFilter(QDir.Dirs)
Run Code Online (Sandbox Code Playgroud)