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 но эта ошибка была исправлена, и я не могу воспроизвести проблему из отчета об ошибке из кода там же.

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

2

Решение

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]