4

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

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

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

有没有办法通过滚动大数据来获得响应更快的体验?我不介意预先等待更长的时间,所以像强制视图预先从模型中读取所有数据这样的事情就可以了。

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

4

2 回答 2

11

两件事情:

  • 重新实现fetchMore()canFetchMore()在您的模型中。请参阅此实现示例。基本上,这两个函数允许对数据进行延迟初始化,并且应该停止 ui 冻结。
  • 替换您对插入和删除功能的使用reset()和使用。dataChanged()现在,您正在强制视图重新计算要显示的 100,000 个项目中的哪一个。
于 2015-04-23T15:07:18.417 回答
7

利用

treeview view;
view.setUniformRowHeights(true);

然后查看不要挂起。

于 2015-07-11T11:56:17.487 回答