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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать были ли внесены изменения в QSqlTableModel  (Прочитано 8338 раз)
mwChief
Гость
« : Март 12, 2010, 08:24 »

Таблица из базы грузится в QSqlTableModel, для отображения данных на форме использую QDataWidgetMapper, вывожу все в несколько виджетов doubleSpinBox и lineEdit и один tableView (при выборе элемента в tableView doubleSpinBox`ы и lineEdit`ы заполняются соотвествующими значениями). Политика обновления у модели OnManualSubmit, сохраняю по нажатию кнопки. Нужно выдать предупреждение о несохраненных данных если пользователь внесет изменения и попытается закрыть окно не сохранив их.
Как лучше это отслеживать? Поиск в Assistante привел к QAbstractItemModel::isDirty() и  QAbstractItemModel::dataChanged(). isDirty вроде бы то что нужно, но проверяет только один элемент а не всю модель. Как пользоватся dataChanged() не совсем понял, не уверен что может подойти.
Форма выглядит вот так:


Записан
BRE
Гость
« Ответ #1 : Март 12, 2010, 08:53 »

Как пользоватся dataChanged() не совсем понял, не уверен что может подойти.
Соединяешь этот сигнал со своим слотом, в котором переменной modified присваивается true.
При закрытии окна, проверяешь эту переменную и если она true, выводишь предупреждение.

Или пробегаешься по всем индексам модели и делаешь проверку isDirty...

Жаль, что Тролли не предусмотрели специальный метод, сообщающий есть ли данный в кеше изменений. Кода там на несколько строк.
« Последнее редактирование: Март 12, 2010, 08:55 от BRE » Записан
mwChief
Гость
« Ответ #2 : Март 12, 2010, 08:57 »

А он не сработает если поставить курсор к примеру в lineEdit, но ничего не изменив снова перенести курсор в другое место? Если сработает, то как лучше всего обрабатывать подобные ситуации?
Записан
BRE
Гость
« Ответ #3 : Март 12, 2010, 09:00 »

А он не сработает если поставить курсор к примеру в lineEdit, но ничего не изменив снова перенести курсор в другое место? Если сработает, то как лучше всего обрабатывать подобные ситуации?
Он сработает, если для модели будет вызван setData, а такое возможно только если в одном из полей пользователь что-то изменит.
Записан
Павел_F.
Гость
« Ответ #4 : Март 12, 2010, 09:09 »

Как пользоватся dataChanged() не совсем понял, не уверен что может подойти.
Соединяешь этот сигнал со своим слотом, в котором переменной modified присваивается true.
При закрытии окна, проверяешь эту переменную и если она true, выводишь предупреждение.
Может быть ситуация когда пользователь поменяет значение, потом второй раз поменяет на предыдущее. Фактически изменений нет, а переменная в true. Тут что-то хитрее нужно.
Записан
BRE
Гость
« Ответ #5 : Март 12, 2010, 09:11 »

Может быть ситуация когда пользователь поменяет значение, потом второй раз поменяет на предыдущее. Фактически изменений нет, а переменная в true. Тут что-то хитрее нужно.
А QSqlTableModel тоже не отслеживает такие изменения, т.е. в кеше будет отмечено обновить это поле, и это будет выполнено при submitAll().
« Последнее редактирование: Март 12, 2010, 09:41 от BRE » Записан
mwChief
Гость
« Ответ #6 : Март 12, 2010, 09:29 »

Что то нехочет ловится QAbstractItemModel::dataChanged(). Пробую так:
void on_model_dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight );

model - имя модели

дальше как бы я ни менял данные на форме, в эту функцию я не попадаю.
« Последнее редактирование: Март 12, 2010, 09:40 от mwChief » Записан
BRE
Гость
« Ответ #7 : Март 12, 2010, 09:34 »

Попробуй подключить сигнал используя connect.  Улыбающийся
Записан
mwChief
Гость
« Ответ #8 : Март 12, 2010, 09:46 »

Через connect заработало, но сигнал срабатывает даже когда я не менял данные, а просто поставил курсор.
Записан
BRE
Гость
« Ответ #9 : Март 12, 2010, 09:57 »

Через connect заработало, но сигнал срабатывает даже когда я не менял данные, а просто поставил курсор.
А в QDataWidgetMapper какая политика обновления установлена?

Цитировать
QDataWidgetMapper::AutoSubmit   0   Whenever a widget loses focus, the widget's current value is set to the item model.
Записан
mwChief
Гость
« Ответ #10 : Март 12, 2010, 10:27 »

Если поменять политику сохранения, я только отложу во времени запись в модель. По вызову submit мапппер также пишет в модель "новые" значения даже если я только прошел по ним курсором.
Может стоит копать в сторону модели? Унаследоваться от QSqlTableModel и сделать свою модель с блекджеком и со своим setData который будет проверять действительно ли отличается новое значение от уже имеющегося, и будет в зависимости от этого менять какой-то флаг?
Записан
mwChief
Гость
« Ответ #11 : Март 13, 2010, 13:56 »

Мыслю правильно? Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Март 13, 2010, 14:06 »

>>Мыслю правильно?
ну как вариант, в общем-то
Записан

Юра.
mwChief
Гость
« Ответ #13 : Март 13, 2010, 18:43 »

А какие еще есть варианты?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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