You need to enable JavaScript to run this app. 设置QSortFilterProxyModel的QTableView基于QSqlQueryModel时数据库更新不刷新
优惠活动
大模型
产品
解决方案
定价
更多

设置QSortFilterProxyModel的QTableView基于QSqlQueryModel时数据库更新不刷新

问题原因

你调用queryModel->query().exec()无法更新数据的核心原因是:QSqlQueryModel::query()返回的是当前查询的副本,对这个副本执行重新查询的操作,不会修改QSqlQueryModel内部已经缓存的数据集,也不会触发模型的数据更新信号,因此视图和代理模型都感知不到数据变化。

正确实现方案

不需要每次重新实例化模型、重新绑定视图,只需要复用已有的queryModel实例,重新调用setQuery方法即可:

  1. 新增独立的刷新数据方法,复用已创建的模型实例:
void form1::refreshData()
{
    // 复用现有模型实例,重新执行查询拉取最新数据,自动触发模型更新信号
    queryModel->setQuery("SELECT * FROM table1");
    
    // 可选:如果执行失败可以打印错误排查
    if (queryModel->lastError().isValid()) {
        qDebug() << "查询更新失败:" << queryModel->lastError().text();
    }
}
  1. 在调用form1::exec()前,直接调用refreshData()即可完成数据同步,不需要重新执行setModels。
补充说明
  • QSortFilterProxyModel会自动监听源模型的变更信号,源模型数据更新后代理会自动同步,不需要额外手动刷新代理
  • 如果你需要保留之前的搜索过滤、排序规则,不需要做额外操作,代理会自动适配新的数据集;如果需要清空之前的搜索状态,可以在刷新后加一行proxyModel->setFilterFixedString("")
  • 如果你使用的是非默认的数据库连接,调用setQuery时需要传入第二个参数指定对应的数据库连接,避免查询走错误的连接导致数据不更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 09:45:06