我有需要在QTreeView中显示的自定义数据。我从QAbstractTableModel派生了我的模型,并实现了rowCount()、columnCount()、data()和headerData()。该模型有一个本地QList>来支持它,并且定义了data()函数来从与QModelIndex参数中接收的行和列直接对应的列表列表中读取值。我遇到了两个问题。
第一个原因是加载一个非常大的文件非常慢,这是可以理解的。第二个原因是滚动动作慢得令人痛苦,我并不真正理解。事实证明,如果我向下拉动滚动手柄,GUI会挂起大约20秒,然后弹回来。如果我把手柄向下拉得更远,挂起的时间就会相应增加。如果我把手柄一直拉到滚动条的底部,在等待应用程序再次响应后,我可以上下拉动手柄,得到更好的响应。
在我看来,QTreeView只要求获得一小部分可用数据,但当我将滚动手柄一直拉到滚动条底部时,一旦应用程序再次做出响应,它就已经读取了所有数据。
有没有一种方法可以通过滚动大数据来编程,以获得更灵敏的体验?我不介意提前等待更长的时间,所以只要强制视图提前读取模型中的所有数据就可以了。
我还认为,我可以回到从QAbstractItemView派生并控制它请求和存储数据的方式,只允许存储查看的数据,以及查看数据前后的条目缓冲区。当然,这意味着我必须控制滚动条,因为句柄大小会指示少量数据,我希望它能像用户处理的数据大小一样向用户显示。如果不必要的话,我真的不想去那里。
两件事:
- 在模型中重新实现
fetchMore()
和canFetchMore()
。请参阅此实现示例。基本上,这两个函数允许对数据进行延迟初始化,并且应该停止ui冻结 - 替换使用
reset()
和dataChanged()
以使用插入和删除功能。现在,您正在强制视图重新计算要显示100000个项目中的哪一个
使用
treeview view;
view.setUniformRowHeights(true);
那景色就不挂了。