QDataWidgetMapper只更新第一个索引到QSqlRelationalTableModel

QDataWidgetMapper only updates first index to QSqlRelationalTableModel

本文关键字:QSqlRelationalTableModel 索引 第一个 更新 QDataWidgetMapper      更新时间:2023-10-16

我有一个关于QT框架部分的问题。我正在使用QT 5.0.2,目前正在Windows上开发。

在我的应用程序中,我有一个与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的一个发生,但是这个bug已经修复了,我也不能从bug报告中从那里的代码重现问题。

我希望你能帮助我。

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

相关文章:
  • 没有找到相关文章