1)我想获取文件夹监视应用程序的文件夹名称。 有没有办法可以过滤掉使用QFileDialog显示的特定文件夹(例如我不希望我的文档显示在文件对话框中)..
2)我不希望用户选择驱动器。默认情况下,此代码中也可以选择驱动器..
dirname=QtGui.QFileDialog.getExistingDirectory(self,'Open Directory','c:\\',QtGui.QFileDialog.ShowDirsOnly)
print(dirname)
有没有办法让我可以将驱动器或某些特定文件夹变灰,以便无法选择它,或者我可以设置文件夹的过滤器以防止显示它。
答案 0 :(得分: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();
请注意,仅非非本机文件对话框支持代理模型。
答案 1 :(得分:1)
您可以尝试使用QDir.Dirs过滤器。
dialog = QtGui.QFileDialog(parentWidget)
dialog.setFilter(QDir.Dirs)
答案 2 :(得分: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应该得到所有应得的信用。
答案 3 :(得分:0)
我知道这不完全是您要问的,但是如果您正在使用 QFileSystemModel,则可以使用名称过滤器选项来完成。
model = QFileSystemModel()
model.setNameFilters(["[abcdefghijklmnopqrstuvwxyz1234567890]*"])
model.setNameFilterDisables(False)
它对我有用,我在互联网上的其他任何地方都找不到答案,所以我想我把它贴在这里。
(我知道我的正则表达式很垃圾,但是使用 [\\w\\d]* 没有用,我感觉很懒。)