5

我尝试构建一个用户界面,该界面显示表格的内容,同时每秒刷新数据。

因此我有一系列模型:

  • QSqlTableModel- 访问表格内容
  • MyModel - 继承自来稍微QIdentityProxyModel修改数据(来源是 TableModel)
  • SomeFilterModels - 以 MyModel 作为源

该链以QTableView. 因为QSqlTableModel每秒刷新一次,所以 TableView 中的任何选择也会每秒被删除。现在我有两个想法来解决这个问题。

  1. 防止 TableModel 检测更改。这不是很好。
  2. 捕获模型即将更改之前和之后触发的一些事件以存储和恢复当前选择。遗憾的是,QIdentityProxyModel不会转发诸如 modelAboutToBeReset 或 modelReset 或 dataChanged 之类的信号。从 MyModel 重新发送这些信号也是不可能的,因为它们是私有的。

我一直在寻找其他方法来解决这些刷新问题,但没有成功。但我无法想象我是第一个使用代理模型链以及定期模型刷新和选择的人。

谁能给我一些提示?

提前致谢。

也许值得注意:

  • 一个QSqlTableModel用于许多 TableViews。(使用不同的 FilterProxyModel 链。)所以我不能因为一个 View 有一个选择而停止刷新。
  • 您可能认为我知道何时调用模型刷新方法。但是现在通过我的 ui 架构传递这个有点复杂。我的意思是模型已更新,并且 TableView 已经通过一些 ProxyModel 连接到更新的模型。应该不需要另一种沟通方式。

希望我的问题有意义。

4

1 回答 1

1

QAbstractItemModel包括许多信号,可以帮助您了解模型中的数据何时发生变化或将要发生变化。特别是,它具有以下信号:

  • 数据已更改
  • headerDataChanged
  • 模型AboutToBeReset
  • 模型重置
  • 列AboutToBeInserted
  • 列AboutToBeMoved
  • 列AboutToBeRemoved
  • 列插入
  • 列移动
  • 列已删除
  • rowsAboutToBeInserted
  • rowsAboutToBeMoved
  • rowsAboutToBeRemoved
  • 行插入
  • 行移动
  • 行已删除

鉴于您丢失了选择,我假设粗体信号是您要关注的信号,因为默认的 Qt 行为是保留选择,如果它们可以删除/插入列或行并且它不影响选择。

连接到这些信号后,modelAboutToBeReset我建议获取单元格的 ID,您可以重复使用以再次选择它们,modelReset然后使用这些 ID 获取QModelIndexs 并使用它们再次选择相同的单元格。

于 2014-02-17T16:06:44.580 回答