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

2024-01-26

我很想知道当具有增量数据获取的主数据模型位于代理或代理链后面时,视图将如何表现。

代理如何进行项目重新排列,例如取消分组代理(示例:http://lynxline.com/jongling-qt-models/ http://lynxline.com/jongling-qt-models/)应该实现 fetchMore()/canFetchMore() 的支持吗?


正在检查QSortFilterProxyModel的来源让我得出这样的结论:

  • QSortFilterProxyModel允许访问已获取的行。呼唤rowCount, data等将表现为源表中没有更多数据。
  • QSortFilterProxyModel (and QAbstractProxyModel默认情况下)路线canFetchMore and fetchMore调用源模型的相应方法。

这意味着当您使用 a 向下滚动视图时QSortFilterProxyModel从动态获取的表填充后,它将使用源模型中的新数据动态填充。但是您不能确定新项目是否会添加到末尾。相反,当向下滚动表格时,其数据可能会完全改变。根据当前的排序和过滤设置,可以在任何位置添加新行。

当没有额外的支持时canFetchMore and fetchMore给定后,所有代理模型(包括链接的UngroupProxyModelclass) 默认情况下会表现得像这样。

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

然而,所有上述问题均取决于实施。有关更多详细信息,请参阅所使用的模型类的代码和文档。我认为可以实现随心所欲的代理模型。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代理和 fetchMore()/canFetchMore() 背后的 Qt 模型 的相关文章