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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] поиск по QSortFilterProxyModel (скорость контейнеров)  (Прочитано 4401 раз)
unkeep
Гость
« : Сентябрь 18, 2013, 14:38 »

Салют.

Есть прокся  (::QSortFilterProxyModel). В ней надо сделать поиск. Требуется выделить ячейку, удовлетворяющую условию, а также двигаться по результатам поиска вперёд\назад.

Делал двумя способами:
1)  переопределял Data. В ней при Qt::BackgroundRole проверялось условие и возвращался цвет. Это для отображения. Для навигации отдельно пробегался по всему дереву, и записывал индексы в список. (выходит дважды проверяю каждый элемент)
2) Пробегался по дереву и записывал нужные индексы в список. В Data при Qt::BackgroundRole проверял, есть ли индекс в списке.
Оба метода не устраивают. 2ой медленно, 1ый чуть быстрее, но не красиво.

setData(childIndex,Qt::yellow,Qt::BackgroundRole) никуда ничего не записывает. А должна ли?
может делегаты использовать?
как эффективней и правильней будет?
« Последнее редактирование: Сентябрь 19, 2013, 12:24 от unkeep » Записан
mutineer
Гость
« Ответ #1 : Сентябрь 18, 2013, 14:46 »

Второй медленнее, чем первый? значит неэффективно список сделан
Записан
unkeep
Гость
« Ответ #2 : Сентябрь 18, 2013, 15:30 »

Второй медленнее, чем первый? значит неэффективно список сделан
я его не делал, QModelIndexList использовал. Медленнее потому что при каждом поиске индекса в списке
Код
C++ (Qt)
if (_searchResults->contains(index))  
   return Qt::yellow;
 
нужно сравнивать текущий индекс с каждый индексом  из списка.
На много быстрее оказалось ещё раз проверить  условие:
Код
C++ (Qt)
if (data(index).toString(). contains(searchStr))  
   return Qt::yellow;
 

но как-то не правильно смешивать поиск и представление...
« Последнее редактирование: Сентябрь 18, 2013, 15:52 от unkeep » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #3 : Сентябрь 18, 2013, 17:14 »

храни результаты в QSet — поиск должен быть быстрее
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
unkeep
Гость
« Ответ #4 : Сентябрь 19, 2013, 09:52 »

храни результаты в QSet — поиск должен быть быстрее
да, в самом меделе быстрее.

только вот не упорядоченный он((
Цитировать
It stores values in an unspecified order
может тогда связку QSet + QList ? для поиска индекса в результатах пользоваться QSet, для навигации по результатам QList?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #5 : Сентябрь 19, 2013, 11:19 »

std::set тогда
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
unkeep
Гость
« Ответ #6 : Сентябрь 19, 2013, 12:24 »

замерил оба способа: QSet + QModelIndexList vs std::set
std::set на 4% медленнее. Так как большой разницы нет, отдаю предпочтение Qtшным контейнерам, чтобы в одном "стиле" всё было
« Последнее редактирование: Сентябрь 19, 2013, 12:33 от unkeep » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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