解决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.hqwc.cn/news/60375.html

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

相关文章

python——案例11:数值交换

案例11:数值交换xinput(输入一个数值赋值给x:) yinput(输入一个数值赋值给y:)tempx #创建临时变量,以此变量为基础进行逐次交换 xy ytemp print(交换后的X的值是:{}.format(x)) # print(交换后的Y的值是:{}.format(y)) #

RabbitMQ学习——发布订阅/fanout模式 topic模式 rabbitmq回调确认 延迟队列(死信)设计

目录 引出点对点(simple)Work queues 一对多发布订阅/fanout模式以登陆验证码为例pom文件导包application.yml文件rabbitmq的配置生产者生成验证码,发送给交换机消费者消费验证码 topic模式配置类增加配置生产者发送信息进行发送控制台查看 rabbitmq回调确认配置类验…

Flutter:屏幕适配

flutter_screenutil flutter_screenutil是一个用于在Flutter应用程序中进行屏幕适配的工具包。它旨在帮助开发者在不同屏幕尺寸和密度的设备上创建响应式的UI布局。 flutter_screenutil提供了一些用于处理尺寸和间距的方法,使得开发者可以根据设备的屏幕尺寸和密度…

Spring(11) Bean的生命周期

目录 一、简介二、Bean的流程1.BeanDefinition2.Bean 的生命周期 三、代码验证1.User 实体类2.MyBeanPostProcessor 后置处理器3.SpringConfig 扫描包配置4.UserTest 测试类5.测试结果6.模拟AOP增强 三、总结 一、简介 首先,为什么要学习 Spring 中 Bean 的生命周期…

C++项目:在线五子棋对战网页版--session管理模块开发

session 在WEB开发中,HTTP协议是⼀种⽆状态短链接的协议,这就导致⼀个客⼾端连接到服务器上之后,服务器不知道当前的连接对应的是哪个用户,也不知道客⼾端是否登录成功,这时候为客⼾端提所有服务是不合理的。因此&am…

Golang bitset 基本使用

安装: go get github.com/bits-and-blooms/bitset下面代码把fmtx换成fmt就行 //------------基本操作------------//构建一个64bit长度的bitsetb : bitset.New(64)//放入一个数b.Set(10)fmtx.Println("add-10:", b.DumpAsBits()) // 0000000…

MyBatisX自动和数据库的字段关联

先下个插件 右键数据库,点MybatisX-Generator 在根据自己需求勾选 actual column:保证数据库的驼峰命名生效

idea模板的使用(配置xml文件模板)

1. 问题的引出 我们在日常项目中可以发现,sql映射文件和mybatis主配置文件,以及application.yml文件中有很多固定不变的内容,为了方面使用,所以可以把这些xml文件设置为模板 2. 创建模板的步骤 按照图片一步一步进行即可 点击…

JavaScript之事件的转控、反控、函数式编程

文章目录 效果图htmlJavaScript解析 效果图 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>函…

基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................... %fine regular gr…

【人工智能前沿弄潮】—— 玩转SAM(Segment Anything)

玩转SAM(Segment Anything) 官网链接&#xff1a; Segment Anything | Meta AI (segment-anything.com) github链接&#xff1a; facebookresearch/segment-anything: The repository provides code for running inference with the SegmentAnything Model (SAM), links fo…

基于微信小程序的传染病酒店隔离平台设计与实现(Java+spring boot+MySQL+微信小程序)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的传染病酒店隔离平台设计与实现&#xff08;Javaspring bootMySQL微信小程序&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;…