我有需要在QTreeView中显示的自定义数据。我从QAbstractTableModel派生了我的模型,并自己实现了rowCount(),columnCount(),data()和headerData()。该模型具有本地QList>支持它,并定义data()函数来读取直接对应于QModelIndex参数中接收的行和列的列表列表中的值。我遇到了两个问题。
首先,非常大的文件的负载非常慢,这是可以理解的。第二个是滚动动作非常缓慢,我并不是真正理解。事实证明,如果我向下拉动滚动手柄,GUI会挂起大约20秒,然后弹出。如果我向下拉动手柄更长的距离,则挂起时间会相应增加。如果我将手柄一直拉到滚动条的底部,等待应用程序再次响应之后,我可以上下拉动手柄并获得更好的响应。
在我看来,QTreeView只需要一小部分可用数据,但是当我将滚动手柄一直拉到滚动条的底部时,一旦应用程序再次响应,它就会通过那一点读取所有数据。
有没有办法通过滚动大数据来编写更具响应性的体验?我不介意在前面等待更长时间,所以只需强制视图从模型中预先读取所有数据就可以了。
我还想过,我可以回到刚刚从QAbstractItemView派生并控制它如何请求和存储数据,只允许存储查看的数据,以及查看数据之前和之后的条目缓冲区。那当然意味着我必须控制滚动条,因为句柄大小会指示少量数据,我希望它能够看到用户应该处理的数据大小。如果我不需要,不是真的想去那里。
答案 0 :(得分:9)
两件事:
fetchMore()
和canFetchMore()
。见this implementation example。基本上,这两个函数允许延迟初始化数据,并且应该停止ui冻结。reset()
和dataChanged()
的使用情况,以使用插入和删除功能。现在,您正在强制视图重新计算要显示的100,000个项目中的哪一个。答案 1 :(得分:4)
使用
treeview view;
view.setUniformRowHeights(true);
然后查看不要挂起。