qfiledialog - Фильтрация папок?
1) Я хочу получить имя папки для приложения мониторинга папок. Есть ли способ, с помощью которого я могу отфильтровать определенные папки от отображения с помощью QFileDialog (например, я не хочу, чтобы мои документы отображались в файл диалога)..
2) Я не хочу, чтобы пользователь выбирал диск. По умолчанию в этом коде диски также могут быть выбраны..
dirname=QtGui.QFileDialog.getExistingDirectory(self,'Open Directory','c:\\',QtGui.QFileDialog.ShowDirsOnly)
print(dirname)
Есть ли способ, которым я могу выделить серые диски или некоторые конкретные папки, чтобы он не мог быть выбран, или я могу установить фильтры для папки, чтобы предотвратить ее появление..
4 ответа
Вы можете попробовать установить модель прокси для своего диалогового окна файла: 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();
Обратите внимание, что модель прокси-сервера поддерживается не только для файловых диалогов.
Вы можете попробовать использовать фильтр QDir.Dirs.
dialog = QtGui.QFileDialog(parentWidget)
dialog.setFilter(QDir.Dirs)
serge_gubenko дал вам правильный ответ. Вам нужно было только проверить имена папок и вернуть "ложь" для тех, которые не должны отображаться. Например, чтобы отфильтровать любые папки с именем "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 должен получить весь должный кредит.
Я знаю, что это не совсем то, о чем вы спрашивали, но если вы работаете с QFileSystemModel, вы можете сделать это с помощью параметра Name Filters.
model = QFileSystemModel()
model.setNameFilters(["[abcdefghijklmnopqrstuvwxyz1234567890]*"])
model.setNameFilterDisables(False)
У меня это сработало, и я не мог найти ответ где-либо еще в Интернете, поэтому решил разместить его здесь.
(Я знаю, что мое регулярное выражение - мусор, но использование [\\w\\d]* не сработало, и я чувствовал себя ленивым.)