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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Редактирование данных и QSQLQueryModel  (Прочитано 7266 раз)
pichini
Гость
« : Июль 23, 2010, 12:20 »

Всем привет!
Помогите новичку. Как правильно переопределить setData? Дайте пример или скажите, где можно посмотреть. Редактирование пока планирую через форму, без использовани edit in place. Саму базу могу обновить через QSQLQuery. А как обновить модель, что-то не разберусь.
Возможно я вообще не правильно к решению задачи подхожу...
PS: QSQLTableModel и QSQLRelationTableModel не походят. Запросы к базе могут быть достаточно сложными и не решаются с помощью этих классов. Единственное, что их объединяет, в запросе есть главная таблица, она и должна редактироваться. 
Записан
crossly
Гость
« Ответ #1 : Июль 23, 2010, 12:30 »

можно просто использовать update.... при удачном выполнении запроса возвращать true ... и не забывать эмитировать dataChanged...
Записан
pichini
Гость
« Ответ #2 : Июль 23, 2010, 12:41 »

можно просто использовать update.... при удачном выполнении запроса возвращать true ... и не забывать эмитировать dataChanged...

Именно так сейчас и сделано, но проблема в том, что список не обновляется, вернее не обновляется модель. Мне бы не хотелось заново делать select к базе по всем данным, так как условия таковы, что редактируется одна строка, известен index строки в модели, и хотелось бы обновить только ее, к тому же позиционирование (выделение) списка должно остаться на этой строке.
Записан
crossly
Гость
« Ответ #3 : Июль 23, 2010, 12:48 »

можно прикрутить кэширование аля QSqlTableModel.... и писать в базу по необходимости...
Записан
pichini
Гость
« Ответ #4 : Июль 23, 2010, 13:22 »

можно прикрутить кэширование аля QSqlTableModel.... и писать в базу по необходимости...


посмотрел я там, че-то сложно для меня показалось Улыбающийся
наверное, вопрос можно по другому поставить, как записать данные в конкретную строку QSQLQueryModel, вернее наследника от него. Затем я вызываю dataChanged и список обновляется.
Записан
mkv
Гость
« Ответ #5 : Июль 23, 2010, 14:04 »

может не стоит "лапшу" в код вставлять?
имхо. логика должна быть в субд...
Записан
pichini
Гость
« Ответ #6 : Июль 23, 2010, 14:43 »

может не стоит "лапшу" в код вставлять?
имхо. логика должна быть в субд...

не понял о чем вы...
модель строится на основе произвольного запроса, в нем есть "главная" таблица. Необходимо сделать возможность ее редактирования. Пока не стал заморачиваться с edit in place, делагетами и т.д. Нарисовал форму, вызываю ее по некому эвенту, подтверждаю изменения, а вот далее я не знаю как лучше реализовать.
Можно отправить изменения в базу через QSQLQuery и перезачитать данные в модель, но в этой реализации я вижу проблемы: как спозиционироваться на нужной мне записи после того как я перечитаю данные из базы, зачем зачитывать все данные, если менялась одна строка и обновить надо только ее.
Второй путь- это правильно переопределить setData (везде написано что для редактируемой модели нужно переопредеялть setData и flag), но это у меня с ходу не получилось, потому-то и прошу помощи


Записан
crossly
Гость
« Ответ #7 : Июль 23, 2010, 14:51 »

можно прикрутить кэширование аля QSqlTableModel.... и писать в базу по необходимости...


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

ну вообще ничего особо сложного там нету.... просто данные кэшируются в QMap<int row,QSqlRecord rec>... и все... просто нужно переопределить еще и метода data что бы он сначала смотрел в кэш, а если в нем нет то брал из query....  дело в том что querymodel берет данные из QSqlQuery изменить данные которого можно только перечитав... т.е . exec()
Записан
pichini
Гость
« Ответ #8 : Июль 23, 2010, 15:00 »

Цитировать
ну вообще ничего особо сложного там нету.... просто данные кэшируются в QMap<int row,QSqlRecord rec>... и все... просто нужно переопределить еще и метода data что бы он сначала смотрел в кэш, а если в нем нет то брал из query....  дело в том что querymodel берет данные из QSqlQuery изменить данные которого можно только перечитав... т.е . exec()

то есть редактируемые формой данные складываются в QMap (реализовать в setData), метод data, который передает данные в tableview, читает изначально из QMap, если в нем нет вызываем QSQLQueryModel::data. Наверное и запись данных в базу стоит определить внутри модели, как то правильнее вроде.   
Записан
crossly
Гость
« Ответ #9 : Июль 23, 2010, 15:02 »

все верно
Записан
pichini
Гость
« Ответ #10 : Июль 23, 2010, 15:05 »

спасибо, буду пробовать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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