Russian Qt Forum
Ноябрь 24, 2024, 06:39
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Базы данных
>
Как узнать были ли внесены изменения в QSqlTableModel
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как узнать были ли внесены изменения в QSqlTableModel (Прочитано 8342 раз)
mwChief
Гость
Как узнать были ли внесены изменения в QSqlTableModel
«
:
Март 12, 2010, 08:24 »
Таблица из базы грузится в QSqlTableModel, для отображения данных на форме использую QDataWidgetMapper, вывожу все в несколько виджетов doubleSpinBox и lineEdit и один tableView (при выборе элемента в tableView doubleSpinBox`ы и lineEdit`ы заполняются соотвествующими значениями). Политика обновления у модели OnManualSubmit, сохраняю по нажатию кнопки. Нужно выдать предупреждение о несохраненных данных если пользователь внесет изменения и попытается закрыть окно не сохранив их.
Как лучше это отслеживать? Поиск в Assistante привел к QAbstractItemModel::isDirty() и QAbstractItemModel::dataChanged(). isDirty вроде бы то что нужно, но проверяет только один элемент а не всю модель. Как пользоватся dataChanged() не совсем понял, не уверен что может подойти.
Форма выглядит вот так:
Записан
BRE
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #1 :
Март 12, 2010, 08:53 »
Цитата: mwChief от Март 12, 2010, 08:24
Как пользоватся dataChanged() не совсем понял, не уверен что может подойти.
Соединяешь этот сигнал со своим слотом, в котором переменной modified присваивается true.
При закрытии окна, проверяешь эту переменную и если она true, выводишь предупреждение.
Или пробегаешься по всем индексам модели и делаешь проверку isDirty...
Жаль, что Тролли не предусмотрели специальный метод, сообщающий есть ли данный в кеше изменений. Кода там на несколько строк.
«
Последнее редактирование: Март 12, 2010, 08:55 от BRE
»
Записан
mwChief
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #2 :
Март 12, 2010, 08:57 »
А он не сработает если поставить курсор к примеру в lineEdit, но ничего не изменив снова перенести курсор в другое место? Если сработает, то как лучше всего обрабатывать подобные ситуации?
Записан
BRE
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #3 :
Март 12, 2010, 09:00 »
Цитата: mwChief от Март 12, 2010, 08:57
А он не сработает если поставить курсор к примеру в lineEdit, но ничего не изменив снова перенести курсор в другое место? Если сработает, то как лучше всего обрабатывать подобные ситуации?
Он сработает, если для модели будет вызван setData, а такое возможно только если в одном из полей пользователь что-то изменит.
Записан
Павел_F.
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #4 :
Март 12, 2010, 09:09 »
Цитата: BRE от Март 12, 2010, 08:53
Цитата: mwChief от Март 12, 2010, 08:24
Как пользоватся dataChanged() не совсем понял, не уверен что может подойти.
Соединяешь этот сигнал со своим слотом, в котором переменной modified присваивается true.
При закрытии окна, проверяешь эту переменную и если она true, выводишь предупреждение.
Может быть ситуация когда пользователь поменяет значение, потом второй раз поменяет на предыдущее. Фактически изменений нет, а переменная в true. Тут что-то хитрее нужно.
Записан
BRE
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #5 :
Март 12, 2010, 09:11 »
Цитата: Павел_F. от Март 12, 2010, 09:09
Может быть ситуация когда пользователь поменяет значение, потом второй раз поменяет на предыдущее. Фактически изменений нет, а переменная в true. Тут что-то хитрее нужно.
А QSqlTableModel тоже не отслеживает такие изменения, т.е. в кеше будет отмечено обновить это поле, и это будет выполнено при submitAll().
«
Последнее редактирование: Март 12, 2010, 09:41 от BRE
»
Записан
mwChief
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #6 :
Март 12, 2010, 09:29 »
Что то нехочет ловится QAbstractItemModel::dataChanged(). Пробую так:
void on_model_dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight );
model - имя модели
дальше как бы я ни менял данные на форме, в эту функцию я не попадаю.
«
Последнее редактирование: Март 12, 2010, 09:40 от mwChief
»
Записан
BRE
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #7 :
Март 12, 2010, 09:34 »
Попробуй подключить сигнал используя connect.
Записан
mwChief
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #8 :
Март 12, 2010, 09:46 »
Через connect заработало, но сигнал срабатывает даже когда я не менял данные, а просто поставил курсор.
Записан
BRE
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #9 :
Март 12, 2010, 09:57 »
Цитата: mwChief от Март 12, 2010, 09:46
Через connect заработало, но сигнал срабатывает даже когда я не менял данные, а просто поставил курсор.
А в QDataWidgetMapper какая политика обновления установлена?
Цитировать
QDataWidgetMapper::AutoSubmit 0 Whenever a widget loses focus, the widget's current value is set to the item model.
Записан
mwChief
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #10 :
Март 12, 2010, 10:27 »
Если поменять политику сохранения, я только отложу во времени запись в модель. По вызову submit мапппер также пишет в модель "новые" значения даже если я только прошел по ним курсором.
Может стоит копать в сторону модели? Унаследоваться от QSqlTableModel и сделать свою модель
с блекджеком и
со своим setData который будет проверять действительно ли отличается новое значение от уже имеющегося, и будет в зависимости от этого менять какой-то флаг?
Записан
mwChief
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #11 :
Март 13, 2010, 13:56 »
Мыслю правильно?
Записан
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #12 :
Март 13, 2010, 14:06 »
>>Мыслю правильно?
ну как вариант, в общем-то
Записан
Юра.
mwChief
Гость
Re: Как узнать были ли внесены изменения в QSqlTableModel
«
Ответ #13 :
Март 13, 2010, 18:43 »
А какие еще есть варианты?
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...