当具有增量数据获取的主数据模型位于代理或代理链之后时,我很想知道视图的行为。
像取消分组代理(例如:http://lynxline.com/jongling-qt-models/)这样的项重排的代理应该如何实现对fetchMore()、/canFetchMore()的支持?
发布于 2014-01-25 10:37:34
通过查看QSortFilterProxyModel
的消息来源,我可以得出结论:
QSortFilterProxyModel
允许访问已经获取的行。调用rowCount
、data
等将表现为源表中没有更多的数据。QSortFilterProxyModel
(和QAbstractProxyModel
)将canFetchMore
和fetchMore
调用路由到源模型的相应方法。这意味着当您向下滚动一个从动态获取表中填充QSortFilterProxyModel
的视图时,它将被来自源模型的新数据动态填充。然而,您不能确定新的项目将被添加到末尾。相反,当向下滚动表时,它的数据可能会完全改变。根据当前的排序和筛选设置,可以在任何地方添加新行。
当不提供对canFetchMore
和fetchMore
的额外支持时,所有代理模型(包括链接的UngroupProxyModel
类)在默认情况下都会这样运行。
QTableView
的行为是显示这样的模型的buggy。例如,如果源模型有行-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(); }
),那么代理模型的行为将完全像模型没有动态填充一样。
https://stackoverflow.com/questions/21348735
复制相似问题