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

使用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 &current, 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:42:47