首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qfiledialog -过滤文件夹?

qfiledialog -过滤文件夹?
EN

Stack Overflow用户
提问于 2010-01-20 19:57:28
回答 4查看 9.2K关注 0票数 7

1)我想获取文件夹监控应用程序的文件夹名称。有没有办法过滤掉使用QFileDialog显示的特定文件夹(例如,我不希望在文件对话框中显示my documents )。

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

代码语言:javascript
复制
dirname=QtGui.QFileDialog.getExistingDirectory(self,'Open Directory','c:\\',QtGui.QFileDialog.ShowDirsOnly)
print(dirname)

有没有办法使驱动器或某些特定文件夹变灰,使其不能被选中,或者是否可以为文件夹设置筛选器,以防止显示它。

EN

回答 4

Stack Overflow用户

发布于 2010-01-24 13:18:18

您可以尝试为文件对话框设置代理模型:QFileDialog::setProxyModel。在代理模型中,类覆盖filterAcceptsRow方法,并为不希望显示的文件夹返回false。下面是一个代理模型的例子;它是c++的,如果有任何问题,请让我知道是否有问题将此代码转换为python。这个模型应该过滤掉文件,只显示文件夹:

代码语言:javascript
复制
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);
}

我是这样称呼它的

代码语言:javascript
复制
QFileDialog dialog;
FileFilterProxyModel* proxyModel = new FileFilterProxyModel;
dialog.setProxyModel(proxyModel);
dialog.setOption(QFileDialog::DontUseNativeDialog);
dialog.exec();

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

票数 8
EN

Stack Overflow用户

发布于 2010-01-22 12:09:36

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

代码语言:javascript
复制
dialog = QtGui.QFileDialog(parentWidget)

dialog.setFilter(QDir.Dirs)
票数 1
EN

Stack Overflow用户

发布于 2010-04-30 22:16:06

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2101100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档