Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt5 QTreeView,具有自定义模型和大数据,滚动速度非常慢_Qt_Qt5_Qtreeview_Qabstracttablemodel - Fatal编程技术网

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

Qt5 QTreeView,具有自定义模型和大数据,滚动速度非常慢,qt,qt5,qtreeview,qabstracttablemodel,Qt,Qt5,Qtreeview,Qabstracttablemodel,我有需要在QTreeView中显示的自定义数据。我从QabStretctTableModel派生了我的模型,并实现了自己的rowCount()、columnCount()、data()和headerData()。该模型有一个本地QList>来支持它,定义data()函数是为了从列表列表中直接读取与QModelIndex参数中接收的行和列对应的值。我遇到了两个问题 首先,加载一个非常大的文件非常慢,这是可以理解的。第二个是滚动动作慢得令人痛苦,这一点我并不真正理解。结果表明,如果我向下拉滚动手柄,

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

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

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

有没有一种方法可以通过滚动查看大数据来获得响应更快的体验?我不介意在前面等待更长的时间,所以像强制视图在前面读取模型中的所有数据这样的事情就行了

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

两件事:

  • 在您的模型中重新实施
    。看见基本上,这两个函数允许延迟初始化您的数据,并应停止ui冻结
  • 替换使用
    reset()
    dataChanged()
    来使用插入和删除功能。现在,您正在强制视图重新指定要显示的100000项中的哪一项
使用

treeview view;
view.setUniformRowHeights(true);

那么视图不要挂起。

多大是非常大?您是否在与树视图交互时通过探查器运行代码?为什么要将
QAbstractTableModel
QTreeView
一起使用?100000个条目,每个条目有3列、一个日期、一个代码编号和一个文本字符串,每个字符串可以包含30到200个字符。我还没有试过剖析器。我想看看是否有什么简单的事情我可能做错了,比如使用QAbstractTableModel和QTreeView。我尝试了不同的配置,QAbstractTableModel和QTreeView最终成功了。我曾尝试将QTreeView更改为QTableView,但在读入数据并发送DataUpdate()信号(我自己的定义连接到QTableView::reset())后,我没有进入模型的data()方法。使用QTreeView,这不是问题。听起来您的模型实现可能有问题。我建议运行Qt,因为它可以帮助检测常见错误。根据我的经验,编写模型子类非常容易出错。尝试使用您提供的链接设置使用模型测试。关于其他人的信息,modeltest.pri有一个错误,但事实证明我需要包含modeltest.pro。不断收到生成错误消息,提示“错误:依赖的'tst_modeltest.cpp'不存在”,即使该文件与其他cpp和h文件在一起。我将整个modeltest文件夹复制到我的项目中,并在其中进行了尝试。同样的结果,谢谢。我照你说的做了,成功了。感谢您的帮助。如何获取早期项目?”fetchMore()'仅适用于后续项。这不是双向的。虽然这是一个很好的建议,但只有代码的答案是不受欢迎的。非常好的提示,谢谢!到2019年,速度仍将提高数亿倍。