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

Qt中SQLite数据库添加行后重选表丢失问题求助

问题根源

你使用了QSqlTableModel::OnManualSubmit编辑策略,这意味着所有新增、修改、删除操作都仅存于模型的本地缓存中,并未真正写入SQLite数据库。当调用model->select()(即点击重新加载按钮)时,模型会从数据库重新拉取数据,本地缓存里未提交的新增行自然会丢失。

解决方法

根据你的使用场景,有两种常用处理方案:

方案一:新增行后立即提交到数据库

修改on_AddButton_clicked()方法,插入行后直接提交,确保新增数据立刻写入数据库,重新加载时不会丢失:

void MainWindow::on_AddButton_clicked()
{
    if (model->insertRow(model->rowCount())) {
        // 提交当前新增行的更改
        model->submit(model->index(model->rowCount()-1, 0));
        qDebug() << "行插入成功并提交到数据库";
    } else {
        qDebug() << "行插入失败";
    }
}

如果需要保留批量操作能力,也可以在重新加载前检查未提交更改,提示用户先提交:

#include <QMessageBox> // 需要添加头文件

void MainWindow::on_reselectTable_clicked()
{
    if (model->isDirty()) {
        QMessageBox::warning(this, "提示", "存在未提交的更改,请先提交再刷新");
        return;
    }
    model->select();
}

方案二:修改编辑策略(适合单条操作即时生效场景)

如果不需要批量提交/撤销功能,可以将编辑策略改为自动提交模式,操作后直接写入数据库:
在MainWindow构造函数中修改:

model->setEditStrategy(QSqlTableModel::OnRowChange);

注:此方式会失去批量提交和撤销的能力,仅适合单条操作即时生效的场景。

额外修复点

你的on_DeleteButton_clicked()方法中,调用removeRow后直接执行model->select(),这会导致删除操作被撤销(因为removeRow仅修改缓存,未提交到数据库)。正确写法如下:

void MainWindow::on_DeleteButton_clicked()
{
    if (model->removeRow(currentRow)) {
        // 立即提交删除操作到数据库
        model->submitAll();
        qDebug() << "行删除成功并提交到数据库";
    } else {
        qDebug() << "行删除失败";
    }
    // 不要在此处调用model->select(),否则未提交的删除会被撤销
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:52:01