qt - qfiledialog - 过滤文件夹?

标签 qt pyqt qfiledialog

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

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

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

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

最佳答案

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

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

关于qt - qfiledialog - 过滤文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2101100/

相关文章:

c++ - 如何按值返回 `QObject` 派生类?

c++ - 使用 QtSql 真的需要 QApplication 吗?

javascript - 如何在 PyQT 5.7 中从 JavaScript 访问 Python 代码?

python - 如何通过 python/pyqt 创建 Windows 7 跳转列表?

Python PyQt4 QFileDialog 图像并在 QListWidget 中加载

python - “selectedFilters”不是有效的关键字参数

python - 如何使用Python在Maya中设置目录?目前使用 PyQt4 但欢迎任何建议

c++ - 通过索引从 QJsonObject 获取值

c++ - 没有参数但仍然进行计算的函数如何使用gtest?

qt - 设置 QFormLayout QLabel 的垂直对齐方式