qfiledialog - Фильтрация папок? - PullRequest
       14

qfiledialog - Фильтрация папок?

7 голосов
/ 20 января 2010

1) Я хочу получить имя папки для приложения мониторинга папок. Есть ли способ, которым я могу отфильтровать определенные папки от отображения, используя QFileDialog (например, я не хочу, чтобы мои документы отображались в диалоговом окне файлов)

2) Я не хочу, чтобы пользователь выбирал диск. По умолчанию в этом коде диски также могут быть выбраны ..

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

Есть ли способ, которым я могу выделить серые диски или некоторые определенные папки, чтобы его нельзя было выбрать, или я могу установить фильтры для папки, чтобы не показывать ее ...

Ответы [ 3 ]

8 голосов
/ 24 января 2010

Вы можете попробовать установить модель прокси для вашего файла диалога: 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 голос
/ 30 апреля 2010

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 должен получить всю причитающуюся сумму.

1 голос
/ 22 января 2010

Вы можете попробовать использовать фильтр QDir.Dirs.

dialog = QtGui.QFileDialog(parentWidget)

dialog.setFilter(QDir.Dirs)
...