Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Bepec от Март 12, 2013, 08:50



Название: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 12, 2013, 08:50
Собственно интересует возможность создания делегата с подгрузкой данных.

К примеру - таблица 2 столбца текстовых. Первый статичен и не меняется. Данные для второго необходимо подгружать из бд.

Возможно ли сделать автоподгрузку данных? Т.е. прокрутили таблицу дальше - подгрузились значения только для видимых элементов. И так далее.

Пока сумбурно мыслю, алгоритм не выстраивается.
Вопрос в возможности такой реализации, на ваш взгляд.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Hellraiser от Март 12, 2013, 12:27
Насчет такого делегата не скажу, но может лучше возложить такую работу на СУБД? К примеру, если текст первого столбца как-то зависит от второго (сумма < 10000 - пишем "денег мало"), или, вообще, константен, то можно на стороне сервера организовать вьюху и пусть она вернет оба столбца. Ну а далее взять SQL модель...


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 12, 2013, 12:55
У меня данные выходят за область базы :D

Берётся файл, считается хеш, запрашивается из базы наличие или отсутствие хеша. Если имеется, то заносится в таблицу и... И вот тут прикол. Колонки хеша и пути к файлу берутся из 2 таблиц sql. И возникает необходимость выдать доп инфо, аля атрибуты файла, размер, последнее изменение, дата создания :D

Для 5 миллионов хранить эти данные в памяти как бы накладно :D Потому и думается мне сделать делегатик, чтобы информация не улетала за 2 гига данных :D

PS ладненько, вопрос закрывается. Попробую сделать, результат отпишу тут же.


Название: Re: Подгружаемый делегат - реально?
Отправлено: schmidt от Март 12, 2013, 21:55
Делегат здесь вряд ли подойдет :) Здесь напрашивается использование QSortFilterProxyModel. Я бы сделал следующим образом:

1. Пишем свою QSortFilterProxyModel с переменным счетчиком-ограничителем строк (rows_display_cnt) с некоторым начальным значением, равным количеству строк, видимых в QTableView при первом отображении без прокрутки (пусть будет 7).
2. Перехватываем wheelEvent() у QTableView и проверяем, хотел ли юзверь прокрутить таблицу и увидеть следующие строки. Если да, подтягиваем ограничитель у QSortFilterProxyModel выше, чтобы фильтр пропускал больше строк.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 12, 2013, 21:58
Кхм. Мб непонятно написал, но информация должна получаться не из модели.
Цитировать
У меня данные выходят за область базы

По аналогии с тоталом - выделяется 10 папок. Они последовательно считаются и появляется их размер. Опять таки последовательно.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Old от Март 12, 2013, 22:20
Делегаты здесь никак.
Все это должна делать модель.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 12, 2013, 22:36
Печалька ) В принципе у меня подгрузка получилась, только вот нестабильная. Ибо при исчезновении с экрана эта инфа уже не нужна. То там утечечка, то неверные значения :D


Название: Re: Подгружаемый делегат - реально?
Отправлено: schmidt от Март 13, 2013, 07:36
А если обратиться к юзабилити - много ли найдется пользователей, которые будут счастливы вращать колёсиком 5млн строк? :) Я бы сделал выбор в пользу постраничного виджета с полем текстового фильтра и возможностью сортировки по столбцам. Для переключения по страницам останется только менять FirstItemIdx и LastItemIdx у вашей SortFilterProxyModel и вызывать reset(), чтобы избавиться от ставших ненужными "висящих" в View данных.

Цитировать
информация должна получаться не из модели.

А почему нет? Модель - это только обертка, frontend для данных. Научите модель динамически связываться с базой и извлекать из нее данные. Станет проще жить, сможете легко пользоваться всеми остальными удобствами Qt Model/View Framework :)

Цитировать
при исчезновении с экрана эта инфа уже не нужна

Тогда вариант с бесконечной прокруткой вам вряд ли подойдет.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 13, 2013, 08:26
Модель собственно должна хранить данные. А я не хочу их хранить. Я хочу, чтобы они создавались, хранились и умирали только в моменты видимости ;)


Название: Re: Подгружаемый делегат - реально?
Отправлено: Old от Март 13, 2013, 08:42
Модель собственно должна хранить данные.
Нет, модель должна удобно представлять данные для гляделки. Хранить данне должна база данных.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Странник от Март 13, 2013, 09:48
Модель собственно должна хранить данные. А я не хочу их хранить. Я хочу, чтобы они создавались, хранились и умирали только в моменты видимости ;)
модель должна возвращать запрошенные данные по обращению, а уж откуда она их берет - это ее личное, модели, дело.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 13, 2013, 12:02
В принципе всё удалося :D

Переписал начисто проект - проблемы ушли.

В результате имеем таблицу с 3 колонками. Третья рассчитывается в делегате :) Минимальные затраты, нет необходимости что-то выкручивать в модели.

Сейчас происходит проба написания SQL модели без использования Qsqltable*.

update: не, даже не так. Написание пустой модели с рассчитывающим делегатом :D


Название: Re: Подгружаемый делегат - реально?
Отправлено: _OLEGator_ от Март 13, 2013, 13:53
Данные для третьей колонки все-таки должна предоставлять модель.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 13, 2013, 14:03
Зачем грузить стандартную модель нестандартными функциями?

Конечно это риторический вопрос.

У меня там используется QSqlTableModel. Три колонки - две текстовые и одна с уникальным идентификатором. Делегат берёт уник, далее делает чудо и отображает натуральные данные о файле. Модель при этом стандартна и не переопределена.

PS задам и тут вопрос - модель-view для ездинья по SQL в комплекте Qt нету чтоли?

Ездить имею в виду - не загружать все данные, а хранить в себе только начало и конец текущего отрезка и загружать данные на лету из БД.

А то SqlTable/Relation модели требуют подгружать весь контент.


Название: Re: Подгружаемый делегат - реально?
Отправлено: schmidt от Март 13, 2013, 19:34
Из документации:
Цитировать
void QSqlTableModel::setFilter ( const QString & filter ) [virtual]

Sets the current filter to filter.

The filter is a SQL WHERE clause without the keyword WHERE (for example, name='Josephine').

If the model is already populated with data from a database, the model re-selects it with the new filter. Otherwise, the filter will be applied the next time select() is called.

Говорят, можно передать ему SQL'ную строку "1 LIMIT ..." для ограничения количества выводимых строк.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 13, 2013, 20:03
Schmidt. Кхм. Ты лично как себе представляешь задания ему SQL запроса о том, что пользователь подвёл ползунок к границе 255 записей? Причем сама таблица ТРЕБУЕТ подгрузки предыдущих строк :) А посмотреть надо 5200000 тысячную строку.


Название: Re: Подгружаемый делегат - реально?
Отправлено: panAlexey от Март 14, 2013, 13:19
Модель собственно должна хранить данные. А я не хочу их хранить. Я хочу, чтобы они создавались, хранились и умирали только в моменты видимости ;)
Вот грид построенный на этой концепции.
Это не Qt, но представление даст.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 14, 2013, 13:22
Кхм. наверно стоит заорать и заблокировать тему :D

Реализовано уже. млиа :D

PS засада со вложениями - не скачиваются.


Название: Re: Подгружаемый делегат - реально?
Отправлено: panAlexey от Март 14, 2013, 13:26
Принцып работы поля: задается запрос, ключевые поля запроса, порле индентификации.
Запрос перерабатывается в зависимости от ключевых полей и дополняется условием выборки, которая выбирает только те записи, которые нужны (помещающиеся на экране +/- пара десятков для равномерного скрола/паинта.)


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 14, 2013, 14:07
Эх. ладно, закрываю тему. Итог - читает мало народу. Много советов - спасибо.
Итог - пишется виджет для скольжения по базе.


Название: Re: Подгружаемый делегат - реально?
Отправлено: panAlexey от Март 14, 2013, 15:58
Итог - пишется виджет для скольжения по базе.
Собственно мне тоже предстоит. Можем посотрудничать?
У меня одних документов 2 ляма. ))


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 14, 2013, 16:36
Да я не против, только стесняюсь :) Никому ещё своего кода не показывал, кроме заказчикоу и команды :D


Название: Re: Подгружаемый делегат - реально?
Отправлено: panAlexey от Март 15, 2013, 15:30
Да я не против, только стесняюсь :) Никому ещё своего кода не показывал, кроме заказчикоу и команды :D
хе-хе-хе....
Мне эта проблема знакома.
Я автор и соавтор нескольких опенсурсных разработок под 1С которыми пользуются десятки точно, а может и сотни тысяч разработчиков. )))
Уж краснеть мне иногда приходилось и за глюки и за код не единожды. )))
Но меня это не останавливало.
Все это тщета, взрослого человека не должно это волновать.
Главное результат. Так что не стесняйся.
Лично меня греет то, что я облегчил работу такой кучи народа. Остальное - не важно.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 15, 2013, 15:36
Готов к сотрудничеству. Вот только что нужно вам, я незнаю. Мне лично нужен вьювер для большого количества записей :D Я уже наваял кой чего, аля "сам рисую" :D


Название: Re: Подгружаемый делегат - реально?
Отправлено: panAlexey от Март 15, 2013, 15:52
Готов к сотрудничеству. Вот только что нужно вам, я незнаю. Мне лично нужен вьювер для большого количества записей :D Я уже наваял кой чего, аля "сам рисую" :D
Мне нужен будет настраиваемый вьювер для проекта (http://code.google.com/p/unnstudio/).
Отчетник (http://code.google.com/p/unnstudioreport/) я начал воять, я его добъю.
Метаданные  (https://docs.google.com/document/d/18pQJ6ROMdXRCSpaUoEnnOxOlPcDb0C264YUNQFKAn3k/edit), т.е. данные для создания таблиц есть.
Хорошо, если бы он был похож на табличное поле (http://www.1cpp.ru/docum/html/TableField.html) из 1С++, но это круто конечно.
Если у меня все получится, то будет неплохой быстро-конструктор для софта (типа такого (http://code.google.com/p/uoreceptorru/)) обслуживающего БД типа аксесса.


Название: Re: Подгружаемый делегат - реально?
Отправлено: Bepec от Март 15, 2013, 17:08
О мой разум... 1С... как давно я его не видел, со времен окончания учёбы по нему :D

Можете наваять простейшее тз?

На вид нужен табличный вьювер и ... эмм) больше ничего не пойму :)

Мозг отказывается работать с русскими строками - кодировка не та :D Табличное поле представляется какой то мешаниной :)


Название: Re: Подгружаемый делегат - реально?
Отправлено: panAlexey от Март 20, 2013, 17:11
Чуть попозжа. Таблицы с данными - они разные бывают.