QDataWidgetMapper обновляет только первый индекс до QSqlRelationalTableModel

У меня проблема с частями фреймворка QT. Я использую QT 5.0.2 и в настоящее время разрабатываю для Windows.

В моем приложении у меня есть Tableview, настроенный с помощью QSqlRelationalTableModel. Рядом с ним у меня есть текстовое поле и 3 поля со списком, связанные с моделью реляционной таблицы. Виджеты сопоставляются с моделью с помощью QDataWidgetMapper следующим образом:

mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
mapper->setItemDelegate(new QSqlRelationalDelegate(this));
mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
mapper->addMapping(ui->courseComboBox, model->fieldIndex("course_shortcode"));
mapper->addMapping(ui->subjectComboBox, model->fieldIndex("subject_name"));
mapper->addMapping(ui->lecturerComboBox, model->fieldIndex("lecturer_name"));
mapper->addMapping(ui->themesTextEdit, model->fieldIndex("event_themes"));

Как вы видите, SubmitPolicy настроен на ручную отправку. Под виджетами у меня есть кнопка, содержащая кнопку сохранения и сброса.

Когда нажимается кнопка сохранения, я делаю это:

qDebug() << this->mapper->submit();
qDebug() << model->lastError().text();

Это создаст следующий вывод:

true 
" " 

Это означает, что отправка прошла успешно и об ошибке не сообщалось.

Тем не менее, в модели обновляется только первое поле. Все остальные виджеты сбрасывают свое значение на значение из исходной модели (потому что модель испускает измененные данные, к которым, я думаю, подключился картограф).

Я попытался удалить одно или два сопоставления, и всегда будет обновляться только поле, сопоставление которого добавляется первым.

Если я изменю submitPolicy на autoSubmit, картограф выполнит свою работу, как и предполагалось. Но мне действительно нужно иметь эти кнопки сброса и применения, а не отправлять данные при изменении.

Это похоже на появление QTBug 1086, но эта ошибка была исправлена, и я не могу ее воспроизвести проблема из сообщения об ошибке из кода там же.

Я надеюсь, что вы можете мне помочь.


person sascha    schedule 18.04.2013    source источник


Ответы (1)


Я отредактировал свой ответ, потому что неправильно понял документацию, и, получив хорошее объяснение, наконец нашел правильный способ получить желаемый результат. Вам следует просто изменить стратегию редактирования модели с помощью QSqlTableModel::setEditStrategy() и изменить ее на QSqlTableModel::OnRowChange. Это необходимо для того, чтобы избежать отправки изменений в базовую базу данных после каждого изменения отдельного столбца, что приведет к обновлению содержимого сопоставленных виджетов после самого первого изменения столбца.

person Albert    schedule 19.06.2013