Russian Qt Forum

Qt => Model-View (MV) => Тема начата: unkeep от Сентябрь 18, 2013, 14:38



Название: [РЕШЕНО] поиск по QSortFilterProxyModel (скорость контейнеров)
Отправлено: unkeep от Сентябрь 18, 2013, 14:38
Салют.

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

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

setData(childIndex,Qt::yellow,Qt::BackgroundRole) никуда ничего не записывает. А должна ли?
может делегаты использовать?
как эффективней и правильней будет?


Название: Re: поиск по QSortFilterProxyModel
Отправлено: mutineer от Сентябрь 18, 2013, 14:46
Второй медленнее, чем первый? значит неэффективно список сделан


Название: Re: поиск по QSortFilterProxyModel
Отправлено: unkeep от Сентябрь 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;
 

но как-то не правильно смешивать поиск и представление...


Название: Re: поиск по QSortFilterProxyModel
Отправлено: kambala от Сентябрь 18, 2013, 17:14
храни результаты в QSet — поиск должен быть быстрее


Название: Re: поиск по QSortFilterProxyModel
Отправлено: unkeep от Сентябрь 19, 2013, 09:52
храни результаты в QSet — поиск должен быть быстрее
да, в самом меделе быстрее.

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


Название: Re: поиск по QSortFilterProxyModel
Отправлено: kambala от Сентябрь 19, 2013, 11:19
std::set тогда


Название: Re: поиск по QSortFilterProxyModel
Отправлено: unkeep от Сентябрь 19, 2013, 12:24
замерил оба способа: QSet + QModelIndexList vs std::set
std::set на 4% медленнее. Так как большой разницы нет, отдаю предпочтение Qtшным контейнерам, чтобы в одном "стиле" всё было