Скрыть элементы QFileSystemModel / QTreeView через индексы, используя определенное правило - PullRequest
0 голосов
/ 08 апреля 2019

Я отображаю содержимое папки в моей программе Qt, используя QTreeView + QFileSystemModel.

Теперь я хочу скрыть определенные элементы этого представления. Правило отображения не основано на именах файлов, поэтому я не могу использовать setNameFilters (). У меня есть простой список QModelIndex, содержащий все элементы, которые я хочу скрыть. Есть ли способ фильтрации представления, используя только этот список?

В своем исследовании я наткнулся на класс QSortFilterProxyModel, но я не мог понять, как его использовать для достижения того, чего я хочу. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 08 апреля 2019

Подкласс QSortFilterProxyModel и переопределите метод filterAcceptsRow для установки логики фильтра.

Например, для фильтрации текущая запись пользователя разрешения:

class PermissionsFilterProxy: public QSortFilterProxyModel
{
public:
    PermissionsFilterProxy(QObject* parent=nullptr): QSortFilterProxyModel(parent)
    {}

    bool filterAcceptsRow(int sourceRow,
            const QModelIndex &sourceParent) const
    {
        QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
        QFileDevice::Permissions permissions = static_cast<QFileDevice::Permissions>(index.data(QFileSystemModel::FilePermissions).toInt());
        return permissions.testFlag(QFileDevice::WriteUser); // Ok if user can write
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QFileSystemModel* model = new QFileSystemModel();
    model->setRootPath(".");

    QTreeView* view = new QTreeView();
    PermissionsFilterProxy* proxy = new PermissionsFilterProxy();
    proxy->setSourceModel(model);
    view->setModel(proxy);
    view->show();
    return app.exec();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...