Russian Qt Forum

Qt => Базы данных => Тема начата: Авварон от Март 05, 2011, 03:01



Название: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 05, 2011, 03:01
Собсно сабж.
Есть таблица 20000*16 полей. Очень сильно тормозит fetchMore. Зафетчить всю таблицу не получается.
Кроме того, сильно тормозит при использовании ползунка скролла, видимо связано с тем, что скроллится оно плавно и data() вызывается на все промежуточные стейты.


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Kolobok от Март 05, 2011, 12:10
Поле, по которому сортируется, индексировано?


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 05, 2011, 12:36
Не. Поможет?)


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Kolobok от Март 05, 2011, 13:14
Должно помочь.


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 05, 2011, 15:26
Не помогло. Вроде сортировка стала быстрее, но тем не менее лаги при скролле и фетче остались такие же. Есть идея что тормозит именно data() при выборе из базы. Что делать?


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Пантер от Март 05, 2011, 15:34
А тормозит постоянно или пока данные не подтянет?


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 05, 2011, 15:40
Именно пока не подтянет данные. Но вот как их подтягивать? (пробовал scrollToBottom - спасает, но до пересортировки:))


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Пантер от Март 05, 2011, 15:51
:)
Код
C++ (Qt)
while (model->canFetchMore ()) {
 model->fetchMore ();
}
 
Это делаешь после селекта и будет тебе счастье.


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 05, 2011, 17:12
Нет не делает. Она не грузит данные по фетчу, только количество записей во вью меняет (ползунок меняется)


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Пантер от Март 05, 2011, 17:18
Хм. Странно. У меня работало.
Тогда пиши свою модель.


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 05, 2011, 18:02
И чо я там сделаю?)


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 05, 2011, 19:44
Проблема же в том, что тупит именно вьюха, когда забирает данные.


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 06, 2011, 02:05
Хм, заюзал тейбл вью вместо три вью, все летать стало:) фетч за 0.2 сек делается


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 10, 2011, 11:40
Так, ну ладно, еще куча мега вопросов от меня. Можно ли сделать чтобы при сорте сохранялось выделение? (модель-то перестраивается, айайай). Ну и еще мега вопрос - 0.2 сек - это нормально или можно улучшить? (если хранить все данные в памяти и тупо делать тейблмодель по этой памяти, то сортируется мгновенно (при помощи QSortFilterProxyModel))


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: GreatSnake от Март 10, 2011, 16:18
Цитировать
Можно ли сделать чтобы при сорте сохранялось выделение? (модель-то перестраивается, айайай)
Да вроде всё просто)
Перегружаешь Q*Model::sort(), перед вызовом базового sort() запоминаешь QAbstractItemView::currentIndex(), после восстанавливаешь.


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 10, 2011, 16:43
индекс не сохраняется, модель-то резетится. Мне по-хорошему надо оставаться на старой записи, а не на конкретной строке. (то есть для реверса это будет rowCount() - currentRow()). Другого способа нет?


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: twp от Март 10, 2011, 16:44
можно попробовать сохранить текущий индекс в QPersistentModelIndex


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 10, 2011, 17:34
хм... а не получится что как раз номера строки/колонки сохранятся? мне-то все ж таки содержимое надо сохранить.


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: asvil от Март 10, 2011, 18:17
нужно отловить сигнал начала сортировки (aboutToBeReset).
затем сохранить primaryKey.
затем отловить сигнал о конце сортировки (reset).
пройтись по всем загруженным записям и найти нужную.
сделать select для selection модели.

ах да, еще нужно номер колонки сохранить.


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: twp от Март 10, 2011, 18:17
уже точно не помню, но вроде в одном проекте использовался такой способ. Вроде модель отслеживает изменения  иобновляет QPersistentModelIndex, А проверка не дала ответа, подходит ли такой способ?


Название: Re: QSqlTableModel тормозит когда включен сортинг
Отправлено: Авварон от Март 10, 2011, 18:36
Пока не тестил, завтра может попробую... Сейчас другие дела есть, профилирую скорость работы разных моделей:)