LINUX.ORG.RU

[qt] Кто фильтрует - модель или представление?

 


0

1

Уже несколько часов сижу и не понимаю, как сделать фильтр в QSqlQueryModel? Понятно, что можно юзать проксимодель, но тогда в QSqlQueryModel будет содержаться вся выборка из базы данных, а это ИМХО может плохо сказаться на производительности. С другой стороны я не нашёл как связать сортировку в QTreeView и в модели.

В общем вопрос такой: за фильтрацию и сортировку отвечает модель или представление?

P.S. Сколько примеров смотрел - там везде написано, мол, в source-модели содержаться все данные, а в proxy-модели только те, что относятся к конкретному представлению.

★★

Модель.

Сортировка: если модель поддерживает постолбовую сортировку, то можно включить ее в представлении (указав столбец для сортировки)

Фильтрация же делается только ручками

namezys ★★★★
()
Ответ на: комментарий от linuxfan

> Прокси. Иначе зачем она вообще нужна?
То есть я могу не бояться сгрузить > 10к записей в прокси-модель? Меня боги железа не проклянут?

SaBo ★★
() автор топика
Ответ на: комментарий от SaBo

Нет. У них там qsort. Только ты сначала заполни исходную модель, а уж потом дергай сортировку. А не на каждом заполнении.

в Qt 3 да. Там это тормозило. А тут n*log(n) где-то получится.

namezys ★★★★
()
Ответ на: комментарий от SaBo

>То есть я могу не бояться сгрузить > 10к записей в прокси-модель? Меня боги железа не проклянут?

В копировании и сортировке 10k записей нет ничего страшного. Насчет отображения не уверен, view с таким количеством записей определенно будет «тормозить» и употреблять много памяти. Правда если ты собираешься делать фильтрацию результатов SQL-запроса, то это как-то нелогично: правильнее добавить фильтрацию в сам запрос.

linuxfan
()
Ответ на: комментарий от linuxfan

view легко справляется с таким объемом записей. Только вот памяти кушает дай боже, если модель стандартная - она очень много что может, но кушать тоже очень любит

namezys ★★★★
()
Ответ на: комментарий от namezys

> Но если у тебя исходная модель в sql - не проще ли фитровать sql запрос. sqlite работает очень быстро

Если я буду фильтровать на этапе SQL-запроса (что ИМХО логично), тогда не ясно, как мне сортировать. Т.е. я хочу выбрать первые 100 документов с даты X по дату Y и сортировать их по автору. Получается, что я сначала фильтрую, потом сортирую, а мне же надо сначала сортировать, а потом фильтровать. Можно, конечно, и сортировать средствами SQL, но, как я уже писал выше, я не понял как привязать сортировку QTreeView, то есть что бы пользователь мог кликнуть на заголовок в таблице, а у меня в модели, например, дёргался бы какой-то метод.


Насчет отображения не уверен, view с таким количеством записей определенно будет «тормозить» и употреблять много памяти.


Здесь я планирую ввести ограничение ~ на 100 строк.

SaBo ★★
() автор топика
Ответ на: комментарий от SaBo

> Можно, конечно, и сортировать средствами SQL, но, как я уже писал выше, я не понял как привязать сортировку QTreeView, то есть что бы пользователь мог кликнуть на заголовок в таблице, а у меня в модели, например, дёргался бы какой-то метод.

virtual void   sort ( int column, Qt::SortOrder order )

namezys ★★★★
()
Ответ на: комментарий от namezys

> virtual void sort ( int column, Qt::SortOrder order )

Значит я ещё не настолько отупел... Пытался юзать эту функцию, но как-то без результата. Значит буду искать ошибку.

Короче говоря, вывод такой:
Фильтрацию и сортировку в SQL-модели можно сделать двумя способами: 1) прокси-модель, 2) средствами самого SQL.

Буду пробовать.
namezys, linuxfan, огромное спасибо за помощь!

SaBo ★★
() автор топика
Ответ на: комментарий от SaBo

Там надо какое-то свойство указать в модели, что она типа сортируемая. Смотри документацию по представлюнию. я просто не помню сходу

namezys ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.