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

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

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

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

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

7
задан serge_gubenko 24 January 2010 в 05:19
поделиться

3 ответа

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

dialog = QtGui.QFileDialog(parentWidget)

dialog.setFilter(QDir.Dirs)
1
ответ дан 7 December 2019 в 01:21
поделиться

Вы можете попробовать настроить прокси-модель для вашего файла диалогового окна: QFiledialog :: SetProxymodel . В классе Proxy Model переопределяют метод FilterAcceptsRow и верните false для папок, которые вы не хотите отображаться. Ниже приведен пример того, как может выглядеть модель прокси; IT'C 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();

Обратите внимание, что прокси-модель поддерживается только диалоговыми окнами Non-Native File.

8
ответ дан 7 December 2019 в 01:21
поделиться

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 должен получить все должное.

1
ответ дан 7 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: