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 _
相关产品推荐
相关产品推荐

