7

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

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

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

有没有一种方法可以使驱动器或某些特定文件夹变灰以使其无法选择,或者我可以为文件夹设置过滤器以防止显示它..

4

4 回答 4

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);
}

我是这样称呼它的

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

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

于 2010-01-24T05:18:17.683 回答
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 应该收到所有应得的信用。

于 2010-04-30T14:16:05.853 回答
1

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

dialog = QtGui.QFileDialog(parentWidget)

dialog.setFilter(QDir.Dirs)
于 2010-01-22T04:09:36.070 回答
0

我知道这不是您要问的,但是如果您使用的是 QFileSystemModel,则可以使用 Name Filters 选项来完成。

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

它对我有用,我在互联网上的其他任何地方都找不到答案,所以我想我把它贴在这里。

(我知道我的正则表达式是垃圾,但是使用 [\\w\\d]* 没有用,我感到很懒惰。)

于 2021-04-30T17:56:42.567 回答