Russian Qt Forum
Ноябрь 23, 2024, 22:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как отобразить все записи из базы сразу, а не кэшируя их  (Прочитано 12142 раз)
olegmar
Гость
« : Февраль 02, 2009, 17:42 »

Добрый день! Программа использует QTreeView, sqlite, QSqlTableModel. После того как она загружает базу с несколькими тысячами записей, то первоначально доступно 256, а остальные только после того, как вы подвигаете скроллбар.. Как можно этого избежать, чтобы показ всех записей происходил единовременно?
Записан
ритт
Гость
« Ответ #1 : Февраль 02, 2009, 19:01 »

попинать автора склайт чтобы тот наконец уж реализовал поддержку query_size
Записан
olegmar
Гость
« Ответ #2 : Февраль 02, 2009, 19:36 »

То есть никак это не побороть?  Непонимающий
Записан
spirit
Гость
« Ответ #3 : Февраль 02, 2009, 20:23 »

это мегакостыль причем не производительный вообще, но можно попробовать сделать вот так
Код
C++ (Qt)
QSqlQueryModel *qmodel = new QSqlQueryModel;
qmodel->setQuery(...);
...
while (qmodel->canFetchMore())
    qmodel->fetchMore();
...
 
« Последнее редактирование: Февраль 02, 2009, 20:26 от spirit » Записан
olegmar
Гость
« Ответ #4 : Февраль 02, 2009, 21:26 »

Господа, спасибо вам за ответы!
spirit, сделал, как вы и посоветовали - результат превосходный!
Записан
ритт
Гость
« Ответ #5 : Февраль 02, 2009, 21:34 »

для нескольких тысяч записей превосходный результат? Улыбающийся
каждому своё, конечно...
Записан
olegmar
Гость
« Ответ #6 : Февраль 18, 2009, 08:40 »

Программа рассчитана для работы на компах Intel Core Quadro, 4 гига оперативы, видео geforce 9600 - работает просто отлично даже с 10000 записей, хотя на данный момент всего 158)
Записан
BRE
Гость
« Ответ #7 : Февраль 18, 2009, 08:57 »

Программа рассчитана для работы на компах Intel Core Quadro, 4 гига оперативы, видео geforce 9600 - работает просто отлично даже с 10000 записей, хотя на данный момент всего 158)
Так может лучше вместо SQLite что-то по серьезней использовать? Что-бы сразу без костылей...
Серьезное железо, наверное, серьезная задача. Почему Lite?
Записан
olegmar
Гость
« Ответ #8 : Февраль 18, 2009, 16:35 »

задача, честно говоря, не серьёзная) Прохожу сейчас практику в Хозяйственном суде, в котором ввели новую процедуру посредничества. Непосредственный начальник и остальные посредники попросили написать небольшую программку для учёта данных по посредничествам. На сервер лезть не хочется, потому что там всё на соплях, да ещё и Оракл стоит, боюсь, что если что поломаю, то меня убьют быстро, а так для их нужд вполне достаточно и они довольны. Программу почти закончил, сейчас занимаюсь пользовательским интерфейсом.
Записан
ритт
Гость
« Ответ #9 : Февраль 18, 2009, 16:46 »

тем-более встроил бы птица! - производительность заметно выше, а удобств столько же Улыбающийся
Записан
olegmar
Гость
« Ответ #10 : Февраль 18, 2009, 17:18 »

Да я бы с радостью, но говорю же вам что в серверной чихнёшь - всё и упадёт)) и это не шутка, всё работает через одно место.

У меня вот ещё каких два вопроса, немного не по теме, возникшие после перехода на Qt 4.5rc1:

использую QTreeView, QSqlTableModel. В таблице, скажем, 150 записей и все они, естественно, на экране не помещаются. Я, для примера, прокрутил список вниз, в самый конец таблицы, и тут мне захотелось добавить запись - вызываю окно, добавляю. (1):Обновляю базу - здесь первый вопрос - запись добавляется, но обновление в таблице не происходит вплоть до перезапуска программы. Приходится загружать файл с базой заново. Нет ли какого сигнала, при получении которого я знал бы, что надо обновить содержимое таблицы?

И второй вопрос - после обновления записей в таблице вышеописанным образом, положение в таблице сбивается и перескакивает в начало списка. Чтобы избежать этого прыжка в начало - я делаю так:

Код:
connect(treeView->verticalScrollBar(),SIGNAL(sliderMoved(int)),this,SLOT(sliderMoved(int)));

В sliderMoved я запоминаю текущее положение скроллбара, и после обновления таблицы пытаюсь его восстановить :

Код:
treeView->verticalScrollBar()->setSliderPosition(currentBarPosition);

и, в принципе, всё это работает, НО лишь в том случае, если был перемещён ползунок скроллбара, а вот в случае если список прокручивался колесом мыши - нет. Пробовал баловаться с value и setValue - вообще не работает... В чём может быть загвоздка, не подскажете?
Записан
ритт
Гость
« Ответ #11 : Февраль 18, 2009, 17:35 »

Да я бы с радостью, но говорю же вам что в серверной чихнёшь - всё и упадёт)) и это не шутка, всё работает через одно место.
Firebird mbedded. в серверную ходить не придётся )

мне захотелось добавить запись - вызываю окно, добавляю. (1):Обновляю базу - здесь первый вопрос - запись добавляется, но обновление в таблице не происходит вплоть до перезапуска программы. Приходится загружать файл с базой заново. Нет ли какого сигнала, при получении которого я знал бы, что надо обновить содержимое таблицы?
почему бы не добавлять запись сразу через QTreeView/QSqlTableModel?
Записан
olegmar
Гость
« Ответ #12 : Февраль 18, 2009, 17:44 »

Это при помощи метода insertRecord у QSqlTableModel, я правильно понимаю?

п.с. спасибо вам за помощь огромное!
Записан
ритт
Гость
« Ответ #13 : Февраль 18, 2009, 18:00 »

можно и insertRecord у QSqlTableModel. главное, что в таком случае модель сама знает, что нужно обновить данные из бд после записи.
только не забывать делать submitAll, если политика обновления не автоматическая.
Записан
olegmar
Гость
« Ответ #14 : Февраль 18, 2009, 19:53 »

уважаемый Константин, попробовал я использовать insertRecord Улыбающийся
Сразу возникло несколько вопросов: с добавлением понятно - работает отлично, а вот как с редактированием уже существующей записи? Я так понимаю, чтобы изменить существующую запись я должен изменять запись по параметру row? Пока ещё не пробовал - сейчас надо бежать домой.

И второй самый главный вопрос - одним из условий работы программы был принцип одновременной работы с файлом-базой нескольких пользователей одновременно, то есть если один добавляет запись, второй сразу же её видит. Всё работало, а вот сейчас при использовании insertRecord не работает. Может посоветуете какое-нибудь решение? Улыбающийся

Ещё раз хотел бы вас поблагодарить!
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 21.