Qt 6.8.2中如何仅在数据库实际提交更新行时发射信号?
解决QSqlRelationalTableModel OnRowChange策略下仅实际提交时发射信号的问题
针对Qt 6.8.2中使用OnRowChange编辑策略的QSqlRelationalTableModel,要实现仅当行真正修改并提交到数据库时才发射自定义信号的需求,可以通过以下方式优化子类化的模型:
核心思路
- 问题根源:直接在
submit()中调用isDirty()会因为提交后模型自动清除脏状态而失效,必须在调用父类submit前检查是否存在待提交的脏行 - 关键方法:利用
dirtyIndexList()获取提交前的所有脏索引,结合submit()的返回值判断提交是否成功,最终仅在有效提交时发射信号
实现代码
#include <QSqlRelationalTableModel> #include <QList> class CustomRelationalTableModel : public QSqlRelationalTableModel { Q_OBJECT public: explicit CustomRelationalTableModel(QObject* parent = nullptr, QSqlDatabase db = QSqlDatabase()) : QSqlRelationalTableModel(parent, db) {} signals: // 发射实际成功提交的行号 void rowSubmitted(int row); public slots: bool submit() override { // 提交前记录所有脏行的索引(此时脏状态尚未被清除) const QList<QModelIndex> dirtyRows = dirtyIndexList(); // 执行父类的提交逻辑 const bool submitResult = QSqlRelationalTableModel::submit(); // 仅当提交成功且存在过脏行时,发射信号 if (submitResult && !dirtyRows.isEmpty()) { // OnRowChange策略下每次submit仅处理当前编辑的一行,取第一个脏行的行号即可 emit rowSubmitted(dirtyRows.first().row()); } return submitResult; } };
代码说明
- 脏行预检查:在调用父类
submit()前通过dirtyIndexList()获取脏行索引,避免提交后脏状态被清除导致无法判断 - 提交结果验证:通过
submit()的返回值确认提交操作是否成功写入数据库,避免提交失败时误发射信号 - 行号获取:针对
OnRowChange策略的特性,每次切换行仅提交当前编辑的一行,直接取脏行列表的第一个元素即可得到提交的行号
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

