crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Отключение ленивой загрузки в QSqlRelationalTableModel
Хаски
  опции профиля:
сообщение 18.10.2012, 18:26
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 18.10.2012
Пользователь №: 3567

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте!
Я создаю модель, связанную с таблицей в БД на SQlite и вывожу ее в tableView:
QSqlRelationalTableModel *model=new QSqlRelationalTableModel;
    model->setTable("publications");
    model->setRelation(6, QSqlRelation("pub_types", "id", "type"));
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    model->select();
    while(model->canFetchMore())
            model->fetchMore();
    ui->tableView_pub->setModel(model);
    ui->tableView_pub->setFocus();
    ui->tableView_pub->selectRow(model->rowCount()-1);

Класс QSqlRelationalTableModel реализован так, что имеет место так называемая "ленивая загрузка" данных. При работе с таблицей подгружается по 255 записей, остальные - по мере прокрутки ползунка. Мне это не нужно, мне нужно, чтобы загружались сразу все данные (память позволяет, объем базы не слишком велик, а вызванные этим неудобства интерфейса мешают).
Во всех методах своего приложения я использую код "while(model->canFetchMore()) model->fetchMore();", и все работает так, как надо - в tableView загружается все содержимое таблицы из БД.
Однако, мне также необходима возможность редактирования ячеек в tableView с синхронизацией с БД (стратегия редактирования - OnFieldChange). При этом, когда пользователь редактирует ячейку из ряда с номером больше 255, после завершения ее редактирования таблица перезагружается из БД, и вновь лишь первые 255 строк. В результате tableview перескакивает к 255 строке, что очень неудобно. Например, если мне нужно быстро отредактировать несколько строк в таблице под номерами 500, 501, 502, у каждой по несколько полей, это не получится сделать быстро и удобно из-за постоянного перескакивания на 255 строку.
Вопрос: как мне изменить поведение tableview, чтобы после заверешения редактирования ячейки в таблице загружалась вся таблица? Или как изменить этот параметр, дающий ограничение в 255 строк?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 18.10.2012, 19:04
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Я вручную SQL запросы отсылал.
Так проще и быстрее, чем через Qt.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.10.2012, 0:30
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Хаски, нужно сделать наследника от модели и в её методах вызывать fetchMore()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Хаски
  опции профиля:
сообщение 19.10.2012, 11:43
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 18.10.2012
Пользователь №: 3567

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я наследовал свой класс QSqlRelationalTableModelExtraFetch от QSqlRelationalTableModel и переопределили в нем метод select() следующим образом:
bool QSqlRelationalTableModelExtraFetch::select()
{
    bool result;
    result = QSqlTableModel::select();
    while(this->canFetchMore())
        this->fetchMore();
    return result;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 18:33