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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работает QDataWidgetMapper::submit  (Прочитано 4964 раз)
hank
Гость
« : Март 18, 2011, 10:37 »

Имею QSqlTableModel и QDataWidgetMapper:
Код
C++ (Qt)
model = new QSqlTableModel(this,DB);
model_mrgsa->setTable("tab");
model_mrgsa->select();
model_mrgsa->setEditStrategy(QSqlTableModel::OnManualSubmit);
model_mrgsa->setFilter("id = 1");
 
ui->tableView->setModel(model);
 
mapper = new QDataWidgetMapper();
mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
mapper->setModel(model);
 
mapper->addMapping(ui->lineEdit_1,model->fieldIndex("f1"));
mapper->addMapping(ui->lineEdit_2,model->fieldIndex("f2"));
 
mapper->toFirst();
 

Далее по нажатию на соответствующую кнопку у меня должны сохраняться в модели и БД изменения, внесённые в line_Edit'ы:
Код
C++ (Qt)
mapper.submit();
model.submitAll();
 

Запускаю приложение, вношу изменения в line_Edit'ы, жму кнопку Save - всё работает, mapper.submit() возвращает true. После этого еще меняю какое-либо поле, снова жму Save - изменения не вносятся, mapper.submit() возвращает false.
Как мне найти причину такого поведения? Аналога lastError я для маппера не нашёл.
Записан
hank
Гость
« Ответ #1 : Март 18, 2011, 11:24 »

Дополнительно обнаружил, что по второму нажатию кнопки Save (т.е. вызов mapper.submit()) mapper.currentIndex() устанавливается на значение -1.
Почему так происходит - не пойму.
Записан
asvil
Гость
« Ответ #2 : Март 18, 2011, 11:28 »

Вообще SqlTableModel делает emit reset() после submit, и соответственно DataWidgetMapper позиционируется на невалидную либо первую строку. Такое поведение должно быть после первого submit'а.
Записан
hank
Гость
« Ответ #3 : Март 18, 2011, 11:38 »

Собственно я эту программу пишу по аналогии с уже существующей. Грубо говоря, я лишь указал другую таблицу в БД и у mapper'а переназвал поля. Поэтому и возникает вопрос, почему почти идентичный код в одном случае работает, а в другом - нет.
То есть мне теперь надо после каждого mapper.submit() делать mapper.setCurrentIndex() в правильное место?
Записан
asvil
Гость
« Ответ #4 : Март 18, 2011, 11:48 »

Идентичный код может зависеть от primary key на таблице, а точнее от его отсутсвия/присутсвия.
Записан
hank
Гость
« Ответ #5 : Март 18, 2011, 12:03 »

primary key автоматически заносится в таблицу до включения mapper'а.
Таблицы в обеих программах аналогичные.
Записан
hank
Гость
« Ответ #6 : Март 18, 2011, 12:14 »

Прошу прощения, был мой косяк.
Оказалось, забыл залить в базу для нужной таблицы внешний ключ.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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