设置QSortFilterProxyModel的QTableView基于QSqlQueryModel时数据库更新不刷新
问题原因
你调用queryModel->query().exec()无法更新数据的核心原因是:QSqlQueryModel::query()返回的是当前查询的副本,对这个副本执行重新查询的操作,不会修改QSqlQueryModel内部已经缓存的数据集,也不会触发模型的数据更新信号,因此视图和代理模型都感知不到数据变化。
正确实现方案
不需要每次重新实例化模型、重新绑定视图,只需要复用已有的queryModel实例,重新调用setQuery方法即可:
- 新增独立的刷新数据方法,复用已创建的模型实例:
void form1::refreshData() { // 复用现有模型实例,重新执行查询拉取最新数据,自动触发模型更新信号 queryModel->setQuery("SELECT * FROM table1"); // 可选:如果执行失败可以打印错误排查 if (queryModel->lastError().isValid()) { qDebug() << "查询更新失败:" << queryModel->lastError().text(); } }
- 在调用
form1::exec()前,直接调用refreshData()即可完成数据同步,不需要重新执行setModels。
补充说明
QSortFilterProxyModel会自动监听源模型的变更信号,源模型数据更新后代理会自动同步,不需要额外手动刷新代理- 如果你需要保留之前的搜索过滤、排序规则,不需要做额外操作,代理会自动适配新的数据集;如果需要清空之前的搜索状态,可以在刷新后加一行
proxyModel->setFilterFixedString("") - 如果你使用的是非默认的数据库连接,调用
setQuery时需要传入第二个参数指定对应的数据库连接,避免查询走错误的连接导致数据不更新
内容的提问来源于stack exchange,提问作者GAL
相关产品推荐
相关产品推荐

