Russian Qt Forum
Ноябрь 24, 2024, 21:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Годный пример кастомной прокси - модели, унаследованной от QAbstractProxyModel  (Прочитано 8358 раз)
Flass
Гость
« : Март 22, 2013, 10:14 »

Дорогие форумчане!
Прошу помощи в виде ссылки ли, архива ли, в виде хорошего примера реализации собственной прокси - фильтрующей модели, унаследованной от QAbstractProxyModel, а не от QSortFilterProxyModel.
Дело в том, что все примеры, которые мне далось найти (на оф. сайте, в рунете, в буржуйских интернетах, в доке), основаны на QSortFilterProxyModel.
Меня не устраивает наследоваться от этого класса, так как в нем нетривиально устроена фильтрация для деревянных моделей в частности. Дело в том, что если потомок содержит искомую строку, а предок нет, то потомок не будет найден. К тому же эта модель, как я понял, принудительно раскрывает всё дерево рекурсивно при фильтрации, и на больших объемах данных(десятки и стони тысяч записей) получаем дикие тормоза, чего мне не нужно.

С благодарностью жду ваших ссылок, вопросов, советов.


PS
Вот http://qt-project.org/forums/viewthread/7782/P15 ссылка на похожую с моей ситуацию, но топикстартер там вернулся опять таки к QSortFilterProxyModel.

Ничего полезного не нашел
http://www.qtcentre.org/threads/28369-Proxy-model-view-update-problem
http://www.qtcentre.org/archive/index.php/t-52278.html
http://www.qtcentre.org/threads/25884-Proxy-model-index-mapping
http://stackoverflow.com/questions/8280302/using-proxy-models
« Последнее редактирование: Март 22, 2013, 10:40 от Flass » Записан
dio
Гость
« Ответ #1 : Март 22, 2013, 13:27 »

 Если у Вас возможны большие объемы данных и данные выгружаются из БД, я рекомендую отказаться от ProxyModel для фильтрации данных. Лучше фильтровать данные при выгрузки из БД (выгружать только то, что нужно), средствами СУБД. Данный функционал следует реализовать в основной модели.
Записан
Flass
Гость
« Ответ #2 : Март 26, 2013, 04:40 »

У меня там несколько иная ситуация. Какую цель я преследую?
Допустим есть модель дерева, которая подгружается динамически, при разворачивании веток (lаzy population), кроме того, в ней реализована порционная подгрузка уже развернутого узла, то есть если в узле очень много записей, то они вытаскиваются на вьюху из результатов запроса по fetchMore.
В то же время есть QTableView, изначально пустой. Пользователь дважды клацает по ячейке, она переходит в режим редактирования. На вьюху навешан делегат QComboBox, в выпадающее меню которого я хочу положить модельку дерева. Потом, пользователь примерно знает в каком узле дерева лежит некоторое значение, которое ему надо вписать в табличку. Он разворачивает этот узел и начинает писать, а в попап выводятся варианты, которые подходят под его значение, из дерева. Вот для этого, последнего, мне и потребовалась своя фильтрующая модель.



ps
Хочу добавить, что обычным комплитером и QLineEdit этой задачи не решить, так как комплитер всегда ищет совпадения с начала строки, а у меня есть требования выводить и те значения, в которых введенная строка содержится не только в начале, а, к примеру, в середине, или в конце.
« Последнее редактирование: Март 26, 2013, 07:01 от Flass » Записан
dio
Гость
« Ответ #3 : Март 26, 2013, 12:16 »

Для того чтобы это работало, пользователь должен развернуть и подгрузить всю ветку дерева. На сколько это будет ему удобно если перед поиском придется N-е количество раз делать fetchMore. К тому же пользователь может и не додуматься, до того, что надо подгрузить все записи и если в выпадающем списке не нашел требуемой записи, будет уверен, что ее нет.
Записан
Flass
Гость
« Ответ #4 : Март 28, 2013, 05:26 »

Поправьте меня если я ошибаюсь.
Есть модель дерева.
Пользователь развернул одну ветку, не прогрузил ее до конца, просто вспомнил что то, что ему надо, в другой ветке. Свернул ту которую открывал (первую) и открыл вторую. Потом при раскрытии второй ветки он воспользовался фильтром для поиска. В этом случае QSortFilterProxyModel будет прогружать "до упора" и первую ветку, несмотря на то, что оно нам не надо, так ведь?
Записан
dio
Гость
« Ответ #5 : Март 29, 2013, 10:59 »

В доке написано:

Цитировать
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.

Логично было бы предположить, что все зависит от условий фильтра. Если родитель не попадает под фильтр, то чилды подгружать смысла нет. Посмотрите исходники QSortFilterProxyModel или добавьте в основную модель отладочную информацию, чтобы точно понять как работает эта модель.

ЗЫ В предыдущем посте я ступил и описал несколько другой случай, когда fetchMore делается не автоматически, а в ручном режиме.   
Записан
Flass
Гость
« Ответ #6 : Март 30, 2013, 06:16 »

В том то и дело, что в моем случае родитель не попадает под фильтр
родитель может называться одним образом, чилды его - как угодно другим образом. Судя по исходнику, там как раз другого поведения не предусмотрено.
Записан
Bepec
Гость
« Ответ #7 : Март 30, 2013, 10:16 »

Это ж аксиома, блин.

Для поиска и фильтрации нужны все данные.

Чтобы получить все данные, необходимо прогрузить всю ветку и подветви.

И никуда вы не денетесь от этого. Ибо в любом другом случае у вас в качестве исходных данных будет лишь кусок, а не целая часть.

И да, никто вам не мешает написать свою модельку/проксю/фильтр, которая сможет останавливать поиск/догрузку.

И если вынести поиск в database, тогда будет значительное облегчение.
Записан
Flass
Гость
« Ответ #8 : Апрель 01, 2013, 09:37 »

Цитировать
Это ж аксиома, блин.

Для поиска и фильтрации нужны все данные.

Для полного поиска да. Но меня интересует ситуация, когда поиск должен производиться в пределах одного развернутого последним узла, без принудительного ковыряния всех недозагруженных других узлов. ели подробнее прочтите тему с начала, от первого поста и вниз.
Цитировать
И да, никто вам не мешает написать свою модельку/проксю/фильтр, которая сможет останавливать поиск/догрузку.
А что я, по вашему, пытаюсь сделать? Просто не могу найти нормального примера модели, сделанной от QAbstractProxyModel. Хотя это уже не столь актуально, я ее почти написал. Но если у вас есть ссылка - поделитесь пожалуйста.
Записан
Bepec
Гость
« Ответ #9 : Апрель 01, 2013, 09:52 »

Помоему вы бредите немного.

Перечитал ещё раз.

Вам нужен рекурсивный поиск по дереву с подгрузкой всех (ВСЕХ) веток и подветок, которые включены в выбранную ветку (т.е. поиск по детям определённой ветки).

Так же вам необходимо прерывание функционала по ненадобности (Открыл одну ветку, поиск начался. Закрыл ветку - поиск прекращается).

Что Вам (именно вам) мешает написать функцию, производящую данное действие в отдельном потоке? 

Мне просто непонятны ваши мотивы, возможно. Но зачем комбобокс с моделью, какие то недоговорки аля "пользователь примерно знает".

Скажите-нарисуйте то, что хотите сделать. И вам подскажут, возможно более удобный и простой вариант.



Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 21.