Qt关于Model/View大数据量刷新的处理经验

这篇具有很好参考价值的文章主要介绍了Qt关于Model/View大数据量刷新的处理经验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

前段时间有同学咨询关于大数据量的Model刷新时卡顿的优化方案,通过评论留言的方式回答了一部分,但感觉不够全面。因为这个是之前项目重点解决的问题,处理的过程中收获颇多,这里就基于之前的项目经验进行完整的总结,希望对大家在处理类似问题的过程中能有所启发。

可能的问题点及优化方法

在解决问题之前,首先需要先确定问题的原因,因为卡顿这类问题,只是一种表现,可能是多个耗时操作共同导致的现象,需要逐个问题耐心解决,对于陈旧项目特别如此,这里建议使用VS的代码调试工具,定位到耗时的具体代码段,才能高效解决问题。以下从常见的耗时点入手,逐个分析。

初始化耗时过长

在主线程中进行View和Model的关联,同时进行Model的初始化,这个是常见的用法,但存在一个问题,如果Model本身的数据量非常大,会导致初始化过程非常久,从而阻塞住主线程。

如果发现是这个问题很好解决,通过将初始化Model的任务推至子线程即可,不过在此之前需要检查初始化的代码中是否存在非必要的耗时操作,确认不是代码逻辑问题,才能把初始化推到子线程里, 不能因为无效操作凭空消耗资源。

QFuture<void> tmpFuture = QtConcurrent::run(m_treadPool, tmpModel, &SourceModelBase::initData);

子线程内初始化可以通过QThread、QtConcurrent实现,如上所示,方便快捷。需要注意的是View和Model的关联,要放在Model初始化完成之后进行,也就是Model从子线程回到主线程之后,关联上视图就意味者需要操作UI,虽然模型和视图是通过信号槽链接,跨线程操作也没有问题,但是在初始化过程中大量的添加操作并没有必要体现在UI上,大量的信号会造成堆积,同样造成主线程阻塞。

更新item耗时过长

完成模型的初始化之后,我们要做的就是维护模型,需要进行增量刷新而不是全量属性,如item的添加、删除和修改,这些都是基于item进行操作的,而不是将模型原有数据全部清空之后重新生成。

由于是针对item进行更新,查找则是这一操作中最耗时的一环,只要找到需要更新的item,后续的修改、删除耗时基本上可以忽略不记。应对该问题最方便的方式就是为所有的item增加唯一表示uuid,在添加如模型时为id和其对于的指针放在map中进行关联,这样能够快速找到需要更新的item,因为map的实现本身就是红黑树,时间复杂度是nlogn的。当然这个是需要服务器支持的,也就是客户端知道需要更新的是哪一项。

还有一种方式,这个是所有场景都支持的,那就是万能的分页,模型内存储的只是有限的数据,而不是全量的数据,减轻维护的压力。

显示耗时过长

一般来说这个问题很少,因为Qt的视图模型之后更新当前视口内的数据,也就是大量的不可见数据是不会进行绘制的。如果怀疑这个问题,可以在模型初始化完成后,且无数据刷新时,大幅度调整滚动条去确认。

m_treeView->setUniformRowHeights(true);

确认有该问题,首先将视图的统一行高开启,如上所示。如果还是没有缓解就需要检查视图、视图代理,确认其中是否有耗时操作。

模型过多

这个问题就更少见了,项目存在大量差别不大的模型,如几十、上百个大数据量模型,这种可以通过代理模型的方式,去减少模型的数量,可以参考我之前的文章《QSortFilterProxyModel的使用》文章来源地址https://www.toymoban.com/news/detail-720391.html

到了这里,关于Qt关于Model/View大数据量刷新的处理经验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt Quick系列(7)—Model-View

    🚀作者:CAccept 🎂专栏:Qt Quick 在QML中,model和view由delegate连接,他们的关系如下👇 1、delegate 属性:delegate知道model的内容以及如何可视化它- 怎么显示 。 2、view知道delegate的概念以及如何布置它们- 怎么摆放 。 3、model属性:model只知道它所表示的数据- 要显示的内容集合 。

    2024年02月12日
    浏览(39)
  • QT Model/View 设计模式中 selection 模型

    Qt的selection模型用于管理TableView中的选择操作。它允许用户选择和操作特定的数据。 当使用Qt的TableView时,可以使用selection模型来实现以下用途: 数据操作 :通过选择模型,可以方便地对所选的单元格或行执行数据操作,例如复制、剪切、粘贴、删除等。 数据筛选 :可以使

    2024年01月20日
    浏览(37)
  • Qt 中model/View 架构 详解,以及案例实现相薄功能

    ​ 我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改的地方写回

    2024年02月06日
    浏览(42)
  • 如何避免 QT 的 View/Model 模式产生消息激活的死循环?

    当收到QTableWidget的itemChanged信号时,关联的槽函数一般用于响应单元格数据的修改。它可以执行以下一些常见的工作: 更新数据:槽函数可以获取修改后的数据,并根据需要更新相关的数据结构或变量。 数据验证:槽函数可以对修改后的数据进行验证,检查其是否满足特定条

    2024年01月21日
    浏览(47)
  • 一文带你了解QT Model/View框架的设计思想和实现机制

    目录 1、QT Model/View框架简介 1.1、QT Model/View是什么? 1.2、QT Model/View框架核心思想 1.3、Model/View框架工作机制 1.4、Model/View框架的类 2、Model 2.1模型简介 2.2、模型索引 2.3、数据角色 2.4、QStringListModel 2.5、QFileSystemModel 2.6、QSortFilterProxyModel 3、View 4、Delegate 5、项选择模型 5.1、QIt

    2024年02月05日
    浏览(105)
  • QT练手小项目-——天气播报小狗(ui展示分析,构造实现,json格式数据分析,界面交互,天气图标处理,小狗语音)

    前言         经过之前一段时间的QT学习,做出一个小软件来总结自己掌握关于qt的知识点。网络上有许多免费的天气接口(api),有xml格式的,也有json格式的。具体xml和json有什么区别,这里我就不去深究了,我们这里用的是一个json格式的数据,所以 重点是对json格式的数据

    2023年04月17日
    浏览(77)
  • Qt QTableView 实现数据改变表格自动刷新

    这里提供一份简单的代码示例,实现QTableView实时刷新数据: 在代码中,我们首先创建一个QStandardItemModel数据模型,并设置表格的行数和列数,同时设置表头和填充数据。然后将数据模型绑定到QTableView中,并实现数据变化自动刷新的功能。最后显示QWidget窗口。 在实际开发中

    2024年02月13日
    浏览(45)
  • 【Qt】使用Qt实现Web服务器(九):EventSource+JSON实现工业界面数据刷新

    效果如下,实时刷新温度、湿度

    2024年04月08日
    浏览(51)
  • qt中cmake自动处理ui文件的前提

    参考了下面的网址 http://cn.voidcc.com/question/p-wpcanvtj-tn.html http://cn.voidcc.com/question/p-wpcanvtj-tn.html [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GUDEGbZx-1691477530154)(/api/file/getImage?fileId=64d1e2ce2a7f2605f9000610)]

    2024年02月04日
    浏览(37)
  • Qt — Graphics/View框架

    Qt的Graphics/View框架被用来存放、显示二维图形元素,处理那些对图形元素进行操作的交互命令。 Qt 应用程序的图形界面包含各种控件,比如窗口、按钮、滚动条等。所有这些控件对象都具有一个共同的基类QWidget。一个QWidget对象是构成图形界面的基本单位。它能够在屏幕上绘

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包