QSqlRelationalTableModel 更新问题

在Qt项目中,使用QSqlRelationalTableModel遇到更新数据后无法保存的问题。问题在于主表的主键包含外键,不符合QSqlRelationalTableModel的要求。通过修改表结构,增加独立的主键字段,解决了数据提交失败的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QSqlRelationalTableModel 更新问题

在开发一个qt项目时,因为涉及操纵多张表结构,我使用QSqlRelationalTableModel作为我的模型(myModel),将其中一个设定为主表,为相应的列设定引用关系表,设定相应的委托。然后在视图中对其进行增删改查操作,发现对于一个已经存在的记录进行修改时,发现视图中的相应项数据能够更新,但是等到再一次更新整个视图时,被更新的项数据撤销。
打印myModel内容,发现数据确实更新了,进行提交submitAll()后再次更新视图数据就被撤销。这说明submitAll并没能将myModel中的更改提交到数据库中。查看myModel->lastError(),并没有任何错误。这说明更新语句并没有任何错误。重新查看帮助文档,发现使用QSqlRelationalTableModel需注意如下事项:

  • The table must have a primary key declared.
  • The table’s primary key may not contain a relation to another table.

重新查看我的表结构,如下:
table A 表格语法:

字段 说明
punId primary key
caseId primary key
typeId primary key

我的数据库中的表有主键,满足第一条,但是这个主键包含3个字段,每个字段都是外键,引

`QSqlRelationalTableModel` 是 `Qt` 数据模型的一部分,用于处理与 SQL 数据库交互的数据。当与 `QTableView` 配合使用时,它可以提供类似表格视图的功能,包括动态加载数据,特别是当你处理大量数据或者不想一次性加载所有数据时,滑块加载(分页或懒加载)就显得尤为重要。 以下是模拟 `QTableView` 使用 `QSqlRelationalTableModel` 实现滑块加载数据的步骤: 1. **设置数据源**: 创建一个 `QSqlDatabase` 对象,连接到你的 SQL 数据库,并执行查询获取需要分页的数据。 ```cpp QSqlDatabase db("your_database_connection"); if (!db.open()) { // 处理错误 } QSqlQuery query("SELECT * FROM your_table LIMIT :start OFFSET :limit", QSql::绑参); query.bindValue(":start", startRow); query.bindValue(":limit", pageSize); QSqlRecord record; while (query.next() && !record.isEmpty()) { QSqlRelationalTableModel::addRows(record); } ``` 在这里,`startRow` 和 `pageSize` 是每页开始的位置和显示行数,通常由用户界面中的滑块控制。 2. **设置分页和模型行为**: 将 `QSqlRelationalTableModel` 设置为分页模式,每次加载 `pageSize` 行。设置 `QTableView` 的 `QAbstractItemView::setModel()` 方法,传递 `QSqlRelationalTableModel` 实例。 ```cpp model = new QSqlRelationalTableModel(this); model->setTable("your_table"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->setSort(orderColumn, Qt::Ordering_AscendingOrder); // 设置排序 model->setFilter(filters); // 设置过滤条件 // 设置分页相关 model->setFetchSize(pageSize); model->select(); ``` 3. **响应滑块事件**: 在用户界面上添加一个滑块控件,当滑动时更新 `startRow` 并调用 `QSqlRelationalTableModel` 的 `select()` 方法,加载新的数据页。 ```cpp connect(slider, &QSlider::valueChanged, [this, model, pageSize](int value) { startRow = value * pageSize; model->select(); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值