QTreeView, QFileSystemModel, setRootPath и QSortFilterProxyModel с RegExp для фильтрации - PullRequest
5 голосов
/ 09 июля 2010

Мне нужно показать QTreeView определенного каталога, и я хочу дать пользователю возможность фильтровать файлы с помощью RegExp.

Как я понимаю, в документации Qt я могу добиться этого с помощью упомянутых классовв заголовке вот так:

// Create the Models
QFileSystemModel *fileSystemModel = new QFileSystemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);

// Set the Root Path
QModelIndex rootModelIndex = fileSystemModel->setRootPath("E:\\example");

// Assign the Model to the Proxy and the Proxy to the View
proxyModel->setSourceModel(fileSystemModel);
ui->fileSystemView->setModel(proxyModel);

// Fix the TreeView on the Root Path of the Model
ui->fileSystemView->setRootIndex(proxyModel->mapFromSource(rootModelIndex));

// Set the RegExp when the user enters it
connect(ui->nameFilterLineEdit, SIGNAL(textChanged(QString)),
        proxyModel, SLOT(setFilterRegExp(QString)));

При запуске программы TreeView корректно фиксируется в указанном каталоге.Но как только пользователь меняет RegExp, создается впечатление, что TreeView забывает свой RootIndex.После удаления всего текста в RegExp LineEdit (или ввода RegExp наподобие «.») Он снова показывает все каталоги (в Windows это означает все диски и т. Д.)

Что я делаю не так?: /

Ответы [ 2 ]

9 голосов
/ 09 июля 2010

Я получил ответ из списка рассылки Qt, который объяснил эту проблему:

То, что я думаю, происходит, это как как только вы начнете фильтровать, Индекс, который вы используете, поскольку ваш корень не делает дольше существует. Затем вид сбрасывается до неверный индекс в качестве корневого индекса. Фильтрация работает в целом дерево модели, а не только на той части, которую вы Посмотрим, начнешь ли ты вводить свой фильтр!

Я думаю, что вам понадобится модифицированная модель прокси, чтобы делать то, что вы хочу. Следует применять только фильтрация по элементам под вашим корнем путь, но пусть сам корневой путь (и все остальное) в одиночку.

Так что после создания подкласса QSortFilterProxyModel и некоторой проверки parent () в функции filterAcceptsRow () это работает теперь, как и ожидалось!

3 голосов
/ 12 сентября 2011

Я нашел это через Google и разработал решение, основанное на этой теме (и других результатах Google). Вы можете найти мое решение по адресу:

https://github.com/ghutchis/avogadro/blob/testing/libavogadro/src/extensions/sortfiltertreeproxymodel.h

https://github.com/ghutchis/avogadro/blob/testing/libavogadro/src/extensions/sortfiltertreeproxymodel.cpp

Одна вещь, которую вы должны помнить (это не упоминается здесь), это то, что дочерние строки не выбираются автоматически QFileSystemModel, поэтому вы должны вызывать fetchMore () для них. В моем случае у нас есть только один уровень подкаталогов, так что это довольно просто.

Если ваш код хотел обрабатывать более разнообразные иерархии каталогов, вам нужно изменить цикл for () в нижней части filterAcceptsRow (), чтобы он был рекурсивным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...