解决Qt的列表加载大量数据卡顿的问题

问题概述

  本人在使用QListView插入大量数据时,界面卡顿十分严重。数据量大概只有上千左右,但是每个Item的内容比较多。当数据不停地插入一段时间后,卡顿到鼠标的移动都有点困难。

解决思路

  QListView是典型的MVC思想的产物。界面呈现出来的数据其实就是model里面的数据,所以,要解决卡顿问题,就得从model下手。
  首先,我们都知道,一个界面展示的数据是有限的,无论再多数据,人眼看到的一定是可视高度内的那几条。所以,我们可以假设表格的item固定高度为H,表格的高度为S,那么展示出来的数量就是 C = S H C=\frac {S}{H} C=HS,我们就称该数量为C吧。
  这样,我们的表格只需要插入C数量的Item就行了。当用户要查看其它数据,拉动滚动条的时候,我们只需要计算当前用户滚动条的位置,所对应的数据的索引,然后再重复利用刚才已经插入的Item,将Item的内容更新就能解决问题了。

代码思路

  • 数据到来的时候,不直接插入model,而是先缓存到一个队列里,称之为Buffer。后面根据计算,再插入/刷新到model。
  • 每次表格大小变化的时候,都需要计算一次当前界面可展示的数据量,称为ShowCount
  • 表格的Item高度固定,展示的数量等于 S h o w C o u n t = 表格高度 I t e m 高度 ShowCount=\frac {表格高度}{Item高度} ShowCount=Item高度表格高度(动态高度很麻烦,没特殊需求直接固定一个合理高度即可)。
  • 滚动条需要自定义,不使用QListView自带的滚动条(需要隐藏)。滚动条高度为Item高度 * 数据总量
  • 滚动条对应的数据索引假设为Index,那么 I n d e x = c e i l ( 当前滚动条位置 I t e m 高度 ) Index=ceil(\frac {当前滚动条位置}{Item高度}) Index=ceil(Item高度当前滚动条位置)
  • 每次拉动滚动条时,Model内部的Item不删除,而是直接把新数据刷新到原本的item上。

最终效果

在这里插入图片描述

代码传送门

gitee代码

其它

  • 滚动条自定义的原因:在不往表格插入大量数据的情况下,我不知道怎么撑起Qt的列表滚动条,知道的请务必告诉我下~
  • 上面的阐述中,可能由于我表达比较匮乏,导致部分人无法GET到我的思路。其实这个就是虚拟化列表的一种实现方法。大家可以去搜搜虚拟化列表,网上有非常多更细致的讲解以及现成稳定的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/83360.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建型模式-单例模式

文章目录 一、创建型模式1. 单例设计模式1.1 单例模式的结构1.2 单例模式的实现(1)饿汉式-方式1(静态变量方式)(2)饿汉式-方式2(静态代码块方式)(3)懒汉式-方…

vue+element 下载压缩包和导出

export function goodsInspectionReportDwnloadZip (params) {return axios({url: "/warehouse-entry-server/v1/goodsInspectionReport/downloadZip",method: "get",params,responseType: "blob"}) } //下载handleDownloadFile() {if (!this.$r…

AMBA总线(AHB)

1.AMBA AMBA(Advanced Microcontroller Bus Architecture)高级微控制器总线结构,定义了用于设计高性能嵌入式微控制器的片上通信标准。   AMBA规范中定义了三种不同的总线:   (1)高级高性能总线(Advanced High-per…

基于nodejs+vue+uniapp微信小程序的短视频分享系统

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 3.1小程序端 用户注册页面,输入用户的个人信息点击注册即可。 注册完成后会返回到登录页面,用户输入自己注…

无人车沿着指定线路自动驾驶与远程控制的实践应用

有了前面颜色识别跟踪的基础之后,我们就可以设定颜色路径,让无人车沿着指定线路做自动驾驶了,视频:PID控制无人车自动驾驶 有了前几章的知识铺垫,就比较简单了,也是属于颜色识别的一种应用,主要…

神码ai火车头伪原创设置【php源码】

大家好,给大家分享一下python编写学生信息管理系统的学生信息保存在哪里,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 火车头采集ai伪原创插件截图: 要求描述: 学生的信息包括:学号&#…

蓝牙资讯|苹果发布AirPods最新开发者固件,最新功能引人关注

苹果面向 AirPods 耳机发布了开发者固件更新 AirPods 6.0 Beta 3,最新内部版本号为 6A5289c。 本次更新适用于 AirPods 3、AirPods Pro 2 和 AirPods Max,不过并非所有 AirPods 耳机都获得了更新。包含5 种新功能 / 新特性: 自适应音频&am…

MySQL5.7 与 MariaDB10.1 审计插件兼容性验证

这是一篇关于发现 MariaDB 审计插件导致 MySQL 发生 crash 后,展开适配验证并进行故障处理的文章。 作者:官永强 爱可生DBA 团队成员,擅长 MySQL 运维方面的技能。热爱学习新知识,亦是个爱打游戏的宅男。 本文来源:原创…

flask使用cookie (设置cookie与查看cookie内容)

1.flask包cookie的使用 设置cookie app.route(/set_cookie) def set_cookie():resp make_response(Setting cookie)resp.set_cookie(username, John)return resp查看cookie: app.route(/get_cookie) def get_cookie():username request.cookies.get(username)return Welco…

Elasticsearch之kibana相关命令

1.中文分词器相关命令 2.拼音分词器相关命令

一个月学通Python(三十四):使用Selenium模拟人工操作及获取网页内容

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教…

React 核心开发者 Dan Abramov 宣布从 Meta 离职

导读React.js 核心开发者、Redux 作者 Dan Abramov 在社交平台发文宣布,将辞去在 Meta 的职务: “我感到苦乐参半,几周后我就要辞去 Meta 的工作了。在 Meta 的 React 组织工作是我的荣幸。感谢我过去和现在的同事接纳我,容忍我犯…

暗黑版GPT流窜暗网 降低犯罪门槛

随着AIGC应用的普及,不法分子利用AI技术犯罪的手段越来越高明,欺骗、敲诈、勒索也开始与人工智能沾边。 近期,专为网络犯罪设计的“暗黑版GPT”持续浮出水面,它们不仅没有任何道德界限,更没有使用门槛,没有…

接口幂等性实现方式

优质博文:IT-BLOG-CN 幂等 操作的特点是一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态&am…

PCB制造中铜厚度的重要性

电子产品中的PCB是现代电子设备中不可或缺的一部分。在PCB制造过程中,铜厚度是一个非常重要的因素。正确的铜厚度可以保证电路板的质量和性能,同时也影响着电子产品的可靠性和稳定性。 一般我们常见的铜厚有17.5um(0.5oz)&#x…

捕捉时刻:将PDF文件中的图像提取为个性化的瑰宝(从pdf提取图像)

应用场景: 该功能的用途是从PDF文件中提取图像。这在以下情况下可能会很有用: 图片提取和转换:可能需要将PDF文件中的图像提取出来,并保存为单独的图像文件,以便在其他应用程序中使用或进行进一步处理。例如&#xff…

微信小程序的项目解构

视频链接 黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_哔哩哔哩_bilibili 接口文档 https://www.escook.cn/docs-uni-shop/mds/1.start.html 1:微信小程序宿主环境 1:常见的宿…

linux_常用命令

一、日常使用命令/常用快捷键命令 开关机命令 1、shutdown –h now:立刻进行关机 2、shutdown –r now:现在重新启动计算机 3、reboot:现在重新启动计算机 4、su -:切换用户;passwd:修改用户密码 5、logou…

如何对电脑文件进行备份?介绍五种常用方法

在现代生活中,我们的电脑中存储着大量重要的文件和数据。然而,电脑硬件可能会损坏,文件可能会被误删除或感染病毒等情况,因此定期备份文件至关重要,本文将介绍五种常用的电脑文件备份方法,并解决电脑数据没…

无涯教程-Perl - endpwent函数

描述 此功能告诉系统您不再希望使用getpwent从密码文件读取条目。在Windows下,使用Win32API::Net函数从域服务器获取信息。 语法 以下是此函数的简单语法- endpwent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $pas…