Russian Qt Forum

Qt => Model-View (MV) => Тема начата: pichini от Июль 23, 2010, 12:20



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


Название: Re: Редактирование данных и QSQLQueryModel
Отправлено: crossly от Июль 23, 2010, 12:30
можно просто использовать update.... при удачном выполнении запроса возвращать true ... и не забывать эмитировать dataChanged...


Название: Re: Редактирование данных и QSQLQueryModel
Отправлено: pichini от Июль 23, 2010, 12:41
можно просто использовать update.... при удачном выполнении запроса возвращать true ... и не забывать эмитировать dataChanged...

Именно так сейчас и сделано, но проблема в том, что список не обновляется, вернее не обновляется модель. Мне бы не хотелось заново делать select к базе по всем данным, так как условия таковы, что редактируется одна строка, известен index строки в модели, и хотелось бы обновить только ее, к тому же позиционирование (выделение) списка должно остаться на этой строке.


Название: Re: Редактирование данных и QSQLQueryModel
Отправлено: crossly от Июль 23, 2010, 12:48
можно прикрутить кэширование аля QSqlTableModel.... и писать в базу по необходимости...


Название: Re: Редактирование данных и QSQLQueryModel
Отправлено: pichini от Июль 23, 2010, 13:22
можно прикрутить кэширование аля QSqlTableModel.... и писать в базу по необходимости...


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


Название: Re: Редактирование данных и QSQLQueryModel
Отправлено: mkv от Июль 23, 2010, 14:04
может не стоит "лапшу" в код вставлять?
имхо. логика должна быть в субд...


Название: Re: Редактирование данных и QSQLQueryModel
Отправлено: pichini от Июль 23, 2010, 14:43
может не стоит "лапшу" в код вставлять?
имхо. логика должна быть в субд...

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




Название: Re: Редактирование данных и QSQLQueryModel
Отправлено: crossly от Июль 23, 2010, 14:51
можно прикрутить кэширование аля QSqlTableModel.... и писать в базу по необходимости...


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

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


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

то есть редактируемые формой данные складываются в QMap (реализовать в setData), метод data, который передает данные в tableview, читает изначально из QMap, если в нем нет вызываем QSQLQueryModel::data. Наверное и запись данных в базу стоит определить внутри модели, как то правильнее вроде.   


Название: Re: Редактирование данных и QSQLQueryModel
Отправлено: crossly от Июль 23, 2010, 15:02
все верно


Название: Re: Редактирование данных и QSQLQueryModel
Отправлено: pichini от Июль 23, 2010, 15:05
спасибо, буду пробовать.