模型刷新后QTableView保留选择

时间:2014-02-06 07:57:52

标签: c++ qt qt4 qtsql

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

因此我有一系列模特:

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

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

  1. 防止TableModel检测到更改。哪个效果不好。
  2. 在模型之前和之后捕获一些事件即将更改为存储和恢复当前选择。遗憾的是QIdentityProxyModel不会转发像modelAboutToBeReset或modelReset或dataChanged这样的信号..也不可能从MyModel重新发送这些信号,因为它们是私有的。
  3. 我正在寻找其他方法来解决这些刷新问题但没有成功。但我无法想象我是第一个使用代理模型链并定期刷新和选择的人。

    有人能给我一些提示吗?

    提前致谢。

    也许值得注意:

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

    希望我的问题有道理。

1 个答案:

答案 0 :(得分:1)

QAbstractItemModel包含许多信号,可以帮助您了解模型中的数据何时或将要更改。特别是,它有以下信号:

  • dataChanged
  • headerDataChanged
  • modelAboutToBeReset
  • modelReset
  • columnsAboutToBeInserted
  • columnsAboutToBeMoved
  • columnsAboutToBeRemoved
  • columnsInserted
  • columnsMoved
  • columnsRemoved
  • rowsAboutToBeInserted
  • rowsAboutToBeMoved
  • rowsAboutToBeRemoved
  • rowsInserted
  • rowsMo​​ved
  • rowsRemoved

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

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