qfiledialog - 过滤文件夹?

7

1)我想要获取一个文件夹监视应用程序的文件夹名称。 是否可以使用QFileDialog过滤掉特定的文件夹,例如我不想在文件对话框中显示我的文档?

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

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

我可以把驱动器或某些特定文件夹变成灰色的吗,使其不能被选择?还是我可以设置文件夹过滤器来防止它显示出来?

4个回答

9
您可以尝试为文件对话框设置代理模型: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);
}

这是我调用它的方法

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

请注意,代理模式仅受非本地文件对话框的支持。

1

serge_gubenko 给出了正确的答案。你只需要检查文件夹名称并对不应显示的文件夹返回“false”。例如,要过滤掉任何名为“private”的文件夹,您可以编写以下代码:

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 应该得到应有的赞誉。


1
你可以尝试使用 QDir.Dirs 过滤器。
dialog = QtGui.QFileDialog(parentWidget)

dialog.setFilter(QDir.Dirs)

感谢apt的回复。但它会列出所有目录...我想只列出特定的目录..上面的代码也是这样做的..我的问题是像文件扩展名过滤器一样,是否有目录过滤器?还有一个问题是当用户选择特定目录时,“qfiledialog中的“确定”按钮是否可以被禁用? - Jeba

0

我知道这不完全是你所问的,但如果你正在使用QFileSystemModel,你可以使用名称过滤器选项来完成。

model = QFileSystemModel()
model.setNameFilters(["[abcdefghijklmnopqrstuvwxyz1234567890]*"])
model.setNameFilterDisables(False)

这对我很有效,而且我在互联网上找不到答案,所以我想在这里发布。

(我知道我的正则表达式很烂,但使用 [\\w\\d]* 不起作用,而且我感觉有点懒。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接