使用OnRowChange编辑策略时,如何获知行已成功提交至数据库?
在Qt 6.8.2中使用
OnRowChange编辑策略时,如何获知行已成功提交至数据库? 在Qt 6.8.2里,使用QSqlTableModel或QSqlRelationalTableModel时,可将编辑策略设置为OnRowChange,该策略会在焦点切换至另一行时自动提交当前行。
上述类提供的信号包括:
void beforeDelete(int row)void beforeInsert(QSqlRecord &record)void beforeUpdate(int row, QSqlRecord &record)void primeInsert(int row, QSqlRecord &record)
这些信号均在行添加或更新前触发,但我需要获知行已成功提交至数据库的时机,比如用来更新其他控件或关联表——因为模型无法感知数据库的变化。
多数Qt示例基于OnManualSubmit编辑策略开发,该策略虽给开发者更多控制权,但需要用户更多交互。我可以通过QTableView检测用户切换行的操作,但QSqlDatabase既无相关信号,也无查询最后操作状态的函数。
可行解决方案
1. 重写QSqlTableModel的submit()方法
OnRowChange策略下,行切换时模型会自动调用submit()提交修改。继承QSqlTableModel并重写该方法,在父类提交成功后发出自定义信号:
class CustomSqlTableModel : public QSqlTableModel { Q_OBJECT public: using QSqlTableModel::QSqlTableModel; bool submit() override { bool success = QSqlTableModel::submit(); if (success) { emit rowSubmitted(currentIndex().row()); } return success; } signals: void rowSubmitted(int row); };
连接rowSubmitted信号即可在提交成功后执行后续操作。
2. 通过selectionModel监听行切换+isDirty判断
利用表格的选择模型监听行切换事件,结合isDirty()方法判断前一行是否提交成功:
connect(tableView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, [=](const QModelIndex ¤t, const QModelIndex &previous) { if (previous.isValid() && !model->isDirty(previous)) { // 前一行已成功提交 emit rowCommitted(previous.row()); } });
当切换行后,若之前的行不再处于脏状态,说明提交已成功。
3. 结合QSqlQuery验证提交状态(进阶)
如果需要更底层的确认,可在重写submit()时检查内部查询的执行状态:
bool CustomSqlTableModel::submit() { bool success = QSqlTableModel::submit(); if (success) { const QSqlQuery &query = this->query(); if (query.isActive() && query.lastError().type() == QSqlError::NoError) { emit rowSubmitted(currentIndex().row()); } } return success; }
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

