Russian Qt Forum

Qt => Базы данных => Тема начата: Yegor от Июль 25, 2012, 12:17



Название: Как ускорить отображение QSqlQueryModel
Отправлено: Yegor от Июль 25, 2012, 12:17
Здравствуйте!

Есть модель QSqlQueryModel. Она отображается в QTableView.
Если сделать, чтобы QSqlQueryModel заполнилась большим количеством данных, например пол миллиона строк, и отобразить ее в QTableView, то QTableView будет сильно тормозить при прокрутке. Чем ниже таблицу в представлении прокручивать, то тем сильнее представление будет тормозить.

Подскажите, пожалуйста, как ускорить этот процесс, чтобы не тормозило.


Название: Re: Как ускорить отображение QSqlQueryModel
Отправлено: Пантер от Июль 25, 2012, 12:20
Ты уверен, что тебе нужно столько данных в таблице?


Название: Re: Как ускорить отображение QSqlQueryModel
Отправлено: Yegor от Июль 25, 2012, 12:27
Да, уверен. Может быть и большее количество данных - миллионы.


Название: Re: Как ускорить отображение QSqlQueryModel
Отправлено: Странник от Июль 25, 2012, 13:06
Да, уверен. Может быть и большее количество данных - миллионы.
и зачем? кто реально с этими миллионами строк работать будет, тем более вниз прокручивать это все?


Название: Re: Как ускорить отображение QSqlQueryModel
Отправлено: CuteBunny от Июль 25, 2012, 14:13
Как работает QSqlQueryModel + QTableView:

QSqlQueryModel не сразу отдает все n-кол-во записей в результате, для этого у QSqlQueryModel есть методы fetchMore, canFetchMore, которые вызываются, когда Вы двигаете scroll у вьюхи, поэтому подтормаживает.

Цитировать
When you have large - or perhaps even infinite - data sets, you will need to add items to the model in batches, and preferably only when the items are needed by the view (i.e., when they are visible in the view).

Мне кажется, когда до конца прокручиваешь вьюху, то уже все данные отрисованы, и вьюха пересатает тормозить, т.к. больше она не вызывает fetchMore.

Кстати, заметил, интересную вещь, может опять показалось, но если допустим есть модель и мы что-то в базе поменяли, когда мы делаем прокрутку вьюхи, то у нас будут показываться новые обновленные данные.


Название: Re: Как ускорить отображение QSqlQueryModel
Отправлено: RVZ от Июль 25, 2012, 14:20
Да, уверен. Может быть и большее количество данных - миллионы.
и зачем? кто реально с этими миллионами строк работать будет, тем более вниз прокручива
ть это все?
Он просто хочет быть проклятым до 13ого колена... (а то может и больше) тоже цель вполне приличная и вполне достойная (так не каждый сможет) ... хотя может быть предложения WHERE использовать религия запрещает (концепция хакера XX века - информация должна быть открыта... в данном случае обратно пропорционально мастерству - вся и сразу)

P.S. ни кто не будет внимательно просматривать строчки если из больше 100-150 проверено (пользователи будут касячить)!!!


Название: Re: Как ускорить отображение QSqlQueryModel
Отправлено: CMorgan от Июль 25, 2012, 15:11
Мне тут подкинули поддержку одной CRM. Так вот, у них во вьюхе отображается заданное в настройке количество записей (они рекомендуют 40, но можно и больше/меньше поставить, это кому как удобно). В пределах этих 40 записей можешь скролить туда сюда, для перехода на следующие или предыдущие 40 записей юзаются кнопочки интерфейса со стрелками влево, вправо (расположенные под гридом).
Попробуй так реализовать интерфейс.     


Название: Re: Как ускорить отображение QSqlQueryModel
Отправлено: Bepec от Июль 25, 2012, 15:21
Это уже немного неприятно пользователю( колена до 12 проклянут 100%).
Проще +-50 считывать.


Название: Re: Как ускорить отображение QSqlQueryModel
Отправлено: Alex_C от Июль 25, 2012, 16:40
Да, но ведь все это давно уже сделано в MS Access - в дельфи при открытии таблицы задаешь, где ее значения будут храниться - на сервере или у клиента. Если задаешь - на сервере - то как раз подгружается только несколько сотен записей. Работает очень быстро. При скроллинге немного подтормаживает - но не страшно.
По ходу нужно сделать как мне fte в соседней ветке советовал:

Цитировать
можно например так - setQuery("select * testtable order by ...... limit кол_во_строк offset строка_номер"
естественно "кол_во_строк" и "строка_номер" модель должна сама определять....

вопрос в малом - как это организовать. :)