Russian Qt Forum

Qt => Базы данных => Тема начата: hank от Март 18, 2011, 10:37



Название: Не работает QDataWidgetMapper::submit
Отправлено: 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 я для маппера не нашёл.


Название: Re: Не работает QDataWidgetMapper::submit
Отправлено: hank от Март 18, 2011, 11:24
Дополнительно обнаружил, что по второму нажатию кнопки Save (т.е. вызов mapper.submit()) mapper.currentIndex() устанавливается на значение -1.
Почему так происходит - не пойму.


Название: Re: Не работает QDataWidgetMapper::submit
Отправлено: asvil от Март 18, 2011, 11:28
Вообще SqlTableModel делает emit reset() после submit, и соответственно DataWidgetMapper позиционируется на невалидную либо первую строку. Такое поведение должно быть после первого submit'а.


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


Название: Re: Не работает QDataWidgetMapper::submit
Отправлено: asvil от Март 18, 2011, 11:48
Идентичный код может зависеть от primary key на таблице, а точнее от его отсутсвия/присутсвия.


Название: Re: Не работает QDataWidgetMapper::submit
Отправлено: hank от Март 18, 2011, 12:03
primary key автоматически заносится в таблицу до включения mapper'а.
Таблицы в обеих программах аналогичные.


Название: Re: Не работает QDataWidgetMapper::submit
Отправлено: hank от Март 18, 2011, 12:14
Прошу прощения, был мой косяк.
Оказалось, забыл залить в базу для нужной таблицы внешний ключ.