Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443

TreeView с фильтром

25.10.2013, 11:18. Показов 4071. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Давно интересовало как в Qt можно сделать дерево с фильтром, как вот на этой картинке:

При наборе текста должны оставаться только те ветки дерева, в которых имеется текст. Также этот текст должен подсвечиваться.

Как такого поведения можно добиться в Qt? Поделитесь, пожалуйста, соображениями или даже кодом (если кто-то уже делал что-то подобное).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.10.2013, 11:18
Ответы с готовыми решениями:

Как организвать выпадающий список с фильтром?
Имеется некоторое однострочное поле ввода и список строк. Хочется, чтобы по мере ввода в это поле ввода под ним появлялся список, состоящий...

Как присвоить серверному контроллу TreeView коллекцию из TreeView, в котором находится информация из БД
Здравствуйте, в общем я кидаю на страницу TreeView и хочу его динамически заполнять, но сразу куча проблем, обо всем по порядку: ...

Поиск с фильтром
Добрый день, есть сайт на joomla Joomla! 2.5.8 На сайте аренда помещений, необходимо сделать поиск с фильтром. В джумле очень плохо...

6
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
25.10.2013, 11:34
фильтровать модель
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
25.10.2013, 22:13  [ТС]
Цитата Сообщение от oxotnik Посмотреть сообщение
фильтровать модель
Хорошее, очевидное соображение. Попробуем:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <QtWidgets>
 
QStandardItemModel* createModel();
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    auto edit = new QLineEdit();
    auto view = new QTreeView();
    auto layout = new QVBoxLayout();
    layout->addWidget(edit);
    layout->addWidget(view);
    auto proxy = new QSortFilterProxyModel();
    proxy->setSourceModel(createModel());
    proxy->setFilterCaseSensitivity(Qt::CaseInsensitive);
    QObject::connect(edit, &QLineEdit::textChanged,
      [&] (QString text) { proxy->setFilterWildcard("*" + text); });
    view->setModel(proxy);
    view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    view->header()->hide();
    view->expandAll();
    QWidget widget;
    widget.setLayout(layout);
    widget.resize(400, 400);
    widget.show();
    return app.exec();
}
 
QStandardItemModel* createModel()
{
    auto model = new QStandardItemModel();
    auto root = model->invisibleRootItem();
    auto append = [&] (QStandardItem *parent, QStandardItem *item) {
        parent->appendRow(item); return item;
    };
    auto world   = append(root, new QStandardItem("World"));
    auto europe  = append(world, new QStandardItem("Europe"));
    auto asia    = append(world, new QStandardItem("Asia"));
    auto america = append(world, new QStandardItem("America"));
    append(europe,  new QStandardItem("Germany"));
    append(europe,  new QStandardItem("France"));
    append(europe,  new QStandardItem("Great Britain"));
    append(asia,    new QStandardItem("Japan"));
    append(asia,    new QStandardItem("Korea"));
    append(asia,    new QStandardItem("China"));
    append(america, new QStandardItem("Unated States"));
    append(america, new QStandardItem("Brazil"));
    append(america, new QStandardItem("Mexico"));
    return model;
}
Но это не работает так как нужно:

Фильтруется каждый узел в пути от корня:
For hierarchical models, the filter is applied recursively to all children. If a parent item doesn't match the filter, none of its children will be shown.
А нужно сделать так, чтобы даже если в листе было совпадение по фильтру, то весь путь до листа должен быть показан.

Вроде бы нужно делать свою proxy модель и переопределять функцию:
C++ (Qt)
1
bool QSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const
Но как это сделать не очень понимаю. Здесь просто приходит очередной узел дерева и не известно, будет ли у него потомок подходящий под фильтр.

Кроме того не ясно как сделать подсвечивание совпадающей подстроки. Скорее всего через custom delegate должно делаться, но как?
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
28.10.2013, 18:48  [ТС]
Может быть кто-то еще поделится соображениями по задаче? Вроде бы задача довольно распространенная...

Бегать внутри filterAcceptsRow по всему поддереву каждый раз не вариант, могут быть тысячи узлов.
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
11.11.2013, 23:33  [ТС]
Совсем никто не сталкивался с такой задачей в Qt?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.11.2013, 23:40
Не делал такого, но посмотри QSortFilterProxyModel может оно именно для этого ...
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
12.11.2013, 01:51  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
посмотри QSortFilterProxyModel может оно именно для этого
Выше уже привел код именно с QSortFilterProxyModel, он не работает так как мне нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2013, 01:51
Помогаю со студенческими работами здесь

Макрос с фильтром
ребят, помогите пожалуйста.. есть таблица &quot;расход по поездам&quot; как в макросе отфильтровать строки со станциями &quot;ишим -...

Подстановка с фильтром
Имеется 3 таблицы: Сотрудники, Факультеты, Кафедры. В тб Сотрудники поле &quot;Факультет&quot; заполняется подстановкой из таблицы факультет....

Работа с фильтром
Добрый день. Помогите пожалуйста. Есть лист иксель в нем данные. Мне нужно отфильтровать данные по 2-м параметрам. 1) По автору книги...

Работа с фильтром
Подскажите как правильно записать, задача: в combobox выбираю имя поля в textbox ввожу его значение, если тип поля числовой, то можно...

Таблица с фильтром
Подскажите, пожалуйста, как создать простую одностолбцовую таблицу HTML с возможностью выбора строк по ключевым словам отдельно задаваемым....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru