通过检查QSortFilterProxyModel的来源,我可以得出以下结论:
QSortFilterProxyModel允许访问已获取的行。调用rowCount,data等等的行为就像源表中没有更多数据。QSortFilterProxyModel(QAbstractProxyModel默认情况下)路由canFetchMore和fetchMore调用源模型的相应方法。这意味着当您向下滚动具有QSortFilterProxyModel从动态获取的表中填充的视图时,该视图将被源模型中的新数据动态填充。但是,您不能确保将新项目添加到末尾。而是,向下滚动表时,其数据可以完全更改。可以根据当前的排序和过滤设置在任何位置添加新行。
如果不提供canFetchMore和的其他支持,fetchMore则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(); }),则代理模型的行为将完全像未动态填充模型一样。