代理和fetchMore()/ canFetchMore()背后的Qt模型

时间:2014-01-25 09:16:14

标签: c++ qt view model proxy

我很想知道在具有增量数据提取的主数据模型位于代理或代理链之后的情况下,视图将如何表现。

像ungrouping proxy(例如:http://lynxline.com/jongling-qt-models/)这样的项目重排的代理应该如何实现对fetchMore()/ canFetchMore()的支持?

1 个答案:

答案 0 :(得分:5)

检查QSortFilterProxyModel的来源可以让我得出结论:

  • QSortFilterProxyModel允许访问已经获取的行。调用rowCountdata等行为就像源表中没有更多数据一样。
  • QSortFilterProxyModel(默认情况下为QAbstractProxyModel)路由canFetchMorefetchMore调用源模型的相应方法。

这意味着当您向下滚动一个动态获取的表中填充了QSortFilterProxyModel的视图时,它将使用源模型中的新数据进行动态填充。但是,您无法确定新项目是否会添加到最后。相反,当向下滚动表格时,其数据可以完全改变。可以在任何地方添加新行,具体取决于当前的排序和过滤设置。

如果没有给出canFetchMorefetchMore的额外支持,则默认情况下,所有代理模型(包括链接的UngroupProxyModel类)的行为都是如此。

QTableView表现出这种模型的错误行为。例如,如果源模型有行-2; -3; 2; 3(让;成为我的答案中的行分隔符),则没有排序的视图通常会显示-2; -3; 2; 3; empty row; empty row之类的内容。空行显示在表格的底部。当用户向下滚动到足够靠近这些项目时,视图会请求获取更多数据。但是,启用排序时,视图会显示-3; -2; empty row; empty row; 2; 3,即它会将空的无效行移动到表的中间或顶部。它不会影响功能,但看起来很尴尬。

但是,所有上述问题都取决于实现。有关更多详细信息,请参阅所用模型类的代码和文档。我认为可以实现代理模型,无论你喜欢什么。

此外,在某些情况下,在显示表中的排序数据之前完全获取源模型是合理的。未获取所有数据时,无法正确排序或加入。如果您获取了源模型数据(例如while(model->canFetchMore()) { model->fetchMore(); }),则代理模型的行为与模型未动态填充完全相同。