LINUX.ORG.RU

QSqlQueryModel, сортировка и фильтрация

 , , ,


0

2

Привет, ЛОР.

Как целесообразнее прикручивать сортировку и фильтрацию к связке QTableView и QSqlQueryModel, если я собираюсь выводить информацию из таблиц SQLite и ориентировочное количество записей – от 40000 до 100000? Без сортировки на моём железе эта связка выводит 40 тыс. записей менее, чем за секунду, что меня вполне устраивает.

Справится ли с этим обычный QSortFilterProxyModel, вставленный между моделью и представлением, или он может «потонуть в данных» и целесообразно модифицировать SQL (колхозить в этом случае, конечно, придётся куда больше)? Или, может, для баз данных есть отдельное готовое решение? Можно, конечно, сказать «попробуй сам», но может, здесь есть люди с более богатым опытом? Вопросы быстродействия они ведь такие – на одной машине/системе может сработать по-одному, а на второй совсем по-другому, поэтому и хочется послушать форумчан, которые шишки, возможно, уже набивали.

Если руками вставлять допусловия в SQL, как сделать, чтобы работа была похожа на сортировку через прокси-модель, щелчками по заголовкам таблиц - это придётся колхозить самостоятельную обработку? Или есть готовое решение? Понятно, что можно отдельную формочку сделать, со списком критериев…

Кто-то на форуме, я смотрю, несколько лет назнад даже свои классы мастерил, правда, на вопросы отвечать не стал…

P.S. Если у кого-то по прочтении моего вопроса возникло дежавю, могу успокоить: это не дежавю. Точно такой же вопрос я задавал на prog.org.ru. И даже автор класса по ссылке там тоже когда-то отметился :))) с тем же результатом :)))

★★★★★

Последнее исправление: hobbit (всего исправлений: 2)
31 декабря 2024 г.

В общем, с сортировкой всё в порядке. С фильтрацией по одному полю тоже (задействовал setFilterKeyColumn(-1) и setFilterWildcard()).

Фильтрацию по нескольким полям, как я понял, надо делать уже через базу. Начал делать динамически формируемый WHERE… и поймал себя на том, что мой QSqlQueryModel становится подозрительно похожим на QSqlTableModel / QSqlRelationalTableModel, там для этого уже готовый setFilter() есть.

Теперь думаю, не перейти ли мне на QSqlRelationalTableModel. Правда, у меня там в одном месте главная таблица ссылается по id на словарь A, а тот тоже по id на словарь B, и строку в модель надо брать именно из B. Насколько я понял, такую цепочку из QSqlRelationalTableModel уже не построишь, надо оставаться на QSqlQueryModel и не жужжать?..

hobbit ★★★★★
() автор топика