QDataWidgetMapper仅将第一个索引更新为QSqlRelationalTableModel

时间:2013-04-18 13:43:01

标签: c++ qt submit qtableview qsqltablemodel

我对QT框架的某些部分有疑问。我正在使用QT 5.0.2,目前正在开发Windows。

在我的应用程序中,我有一个使用QSqlRelationalTableModel设置的Tableview。在它旁边,我有一个文本字段和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 
" " 

这意味着提交成功,并且没有报告错误。

然而,只有第一个字段在模型中得到更新。所有其他小部件将其值重置为原始模型的值(因为模型会发出datachanged,我猜测映射器将其连接到其中)。

我尝试删除一个或两个映射,并且总是在第一个添加映射的字段上更新。

如果我将submitPolicy更改为autoSubmit,则映射器将按预期工作。但我确实需要重置和应用按钮,而不是在更改时提交数据。

这似乎是QTBug 1086的出现,但是这个bug得到修复,我也无法从代码中的bug报告中重现问题。

我希望你能帮助我。

1 个答案:

答案 0 :(得分:3)

我编辑了我的答案,因为我误解了文档,在得到一个好的解释后,我终于得到了正确的方法来获得所需的结果。 您应该使用QSqlTableModel :: setEditStrategy()修改模型编辑策略,并将其更改为QSqlTableModel :: OnRowChange。 这是为了避免在每次单个列修改之后将修改发送到底层数据库,这将在第一次列更改后生成映射的小部件内容的更新。