Qt5 QTreeView具有自定义模型和大数据非常慢的滚动

时间:2015-04-22 13:11:25

标签: qt qt5 qtreeview qabstracttablemodel

我有需要在QTreeView中显示的自定义数据。我从QAbstractTableModel派生了我的模型,并自己实现了rowCount(),columnCount(),data()和headerData()。该模型具有本地QList>支持它,并定义data()函数来读取直接对应于QModelIndex参数中接收的行和列的列表列表中的值。我遇到了两个问题。

首先,非常大的文件的负载非常慢,这是可以理解的。第二个是滚动动作非常缓慢,我并不是真正理解。事实证明,如果我向下拉动滚动手柄,GUI会挂起大约20秒,然后弹出。如果我向下拉动手柄更长的距离,则挂起时间会相应增加。如果我将手柄一直拉到滚动条的底部,等待应用程序再次响应之后,我可以上下拉动手柄并获得更好的响应。

在我看来,QTreeView只需要一小部分可用数据,但是当我将滚动手柄一直拉到滚动条的底部时,一旦应用程序再次响应,它就会通过那一点读取所有数据。

有没有办法通过滚动大数据来编写更具响应性的体验?我不介意在前面等待更长时间,所以只需强制视图从模型中预先读取所有数据就可以了。

我还想过,我可以回到刚刚从QAbstractItemView派生并控制它如何请求和存储数据,只允许存储查看的数据,以及查看数据之前和之后的条目缓冲区。那当然意味着我必须控制滚动条,因为句柄大小会指示少量数据,我希望它能够看到用户应该处理的数据大小。如果我不需要,不是真的想去那里。

2 个答案:

答案 0 :(得分:9)

两件事:

  • 在模型中重新实施fetchMore()canFetchMore()。见this implementation example。基本上,这两个函数允许延迟初始化数据,并且应该停止ui冻结。
  • 替换reset()dataChanged()的使用情况,以使用插入和删除功能。现在,您正在强制视图重新计算要显示的100,000个项目中的哪一个。

答案 1 :(得分:4)

使用

treeview view;
view.setUniformRowHeights(true);

然后查看不要挂起。