You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
};

代码说明

  1. 脏行预检查:在调用父类submit()前通过dirtyIndexList()获取脏行索引,避免提交后脏状态被清除导致无法判断
  2. 提交结果验证:通过submit()的返回值确认提交操作是否成功写入数据库,避免提交失败时误发射信号
  3. 行号获取:针对OnRowChange策略的特性,每次切换行仅提交当前编辑的一行,直接取脏行列表的第一个元素即可得到提交的行号

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:27:23