QTableWidget加载大文件数据

news2024/11/29 4:49:30

由于最近在项目中需要加载几GB的文件,并且需要在QTableWidget中进行显示;粗略估计可能得有几千万行,如果使用常规的方法,直接在QTableWidget中进行全部显示,会比较卡。所以查找相关资料,最终想到了一个比较巧妙的实现方法。

基本思路是:QTablewidget中每一次可见的行数基本上只有几十行,即便全屏显示,最多也就100行(应该远远达不到),而电脑的性能刷新100行的数据基本上也是毫秒级别的(没有实测),所以,只需要每一次QTableWidget的滚动条变化时,重新把可见的数据填充进去就可。

代码实现:

1、创建CacheTableWidget类,管理QTableWidget和自定义的QScrollBar对象,目的是要实现上述功能,需要隐藏QTableWidget自身的滚动条,利用自己创建的QScrollBar对象实现QTableWidget的滚动效果。

 

 m_tw:填充数据的QTableWidget

m_vBar:模拟QTableWidget的滚动条

m_viewRow:每次视图刷新时,QTableWidget可以显示的行数

verticalValueChanged:自定义滚动条变化时,通知上层更新表格数据

 此处隐藏掉QTableWidget的滚动条,并设置样式,主要目的是为了让自定义的滚动条看起来像QTableWidget原生的效果;

另外:QTableWidget的监听事件,必须监听QTableWidget的viewport视图,否则无法捕获QTableWidget的鼠标事件;

 此处将QTableWidget和QScrollBar通过布局拼装在一起,设置的样式是为了让QTableWidget和QScrollBar看起来是一体的。

 重新实现resizeEvent事件,捕获窗体变化时,重新计算QTableWidget可显示的行数,并通知上层刷新数据;另外qCeil函数导致QTableWidget会多刷新一行数据,可能会导致最后一行数据无法显示上有问题,可以改为qFloor函数;

 

 捕获鼠标滚动事件,模拟鼠标滚动效果;

上层更新表格数据的方法就比较简单,每一次滚动条变化时,清空QTableWidget内容,以QScrollBar的值为索引刷新QTableWidget的数据; 

 上层使用时,需要调用setMaxLine函数,设置m_vbar的最大值,需要和自定义的结果集对应,此处为list对象;

注:addItem函数为自定义的QTableWidget添加一行的方法,此处报错仅仅只是为了演示,实际上会根据文件格式,定义自己的数据结构,此处用QStringList代替,所以会有函数不匹配的问题;

总结:

1、最开始想到的办法其实是通过分页的形式进行显示,即将数据按100行进行分页,如1、2、3、4、5、6...,QTableWidget每次加载3页的数据,即QTableWidget每次加载300行数据,当其滚动条落在第3页时,将2页的数据插入到前100行,第4页数据追加到200~300行;当滚动条由第3页滚动到第4页数据时,将之前的第2页数据删除,将第5页的数据追加到200~300行,即让QTableWidget滚动条的值始终落在100~200行之间,每次跳页时动态调整一次,这种方法调试了很长时间,始终无法处理好QTableWidget的滚动条和自定义滚动条之间的关系,实现的效果一直不好后续就放弃了。

2、增加分页按钮,即增加上一页、下一页按钮,每次通过点击按钮切换数据。由于没有现成的库,还需要重新调整按钮样式及布局,所以此作为备选。

3、后续想到的办法就是QTableWidget每一次可见的数据只有几行,每次只刷新这几行的数据应该会非常快,所以进行尝试,发现可行。

4、关于大文件数据读取这块,目前采用的方式还是单线程读取,后续可能还得改进,目前想到的方法有几种:a.将大文件进行分割,如1GB的文件,分割为5份,启用5个线程读取,最后进行数据合并。b.通过map文件映射的方法,读取。c.延时读取,先读取200行,QTableWidget显示到第100行时,在读取100行缓存等,可以灵活利用seek函数。

效果截图:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法基础学习笔记——⑧堆\哈希表

✨博主:命运之光 ✨专栏:算法基础学习 目录 ✨堆 🍓堆模板: ✨哈希表 🍓一般哈希模板: 🍓字符串哈希模板: 前言:算法学习笔记记录日常分享,需要的看哈O(…

【是C++,不是C艹】 类与对象 | 认识面向对象 | 访问限定符 | 封装 | this指针

💞💞欢迎来到 Claffic 的博客💞💞 👉 专栏:《是C,不是C艹》👈 前言: 在C入门之后,就要进入C的第一个核心:类与对象,这期带大家认识认识…

Multichain跨链无法到账,DApp真去中心化or伪去中心化?

团队出问题,DApp就用不了,multichain被不少人质疑伪去中心化,甚至更有人开始质疑web3,那么这到底是怎么回事呢? 跨链桥问题让DApp的去中心化引发质疑 事情是这样的,5月24下午0xscope发推称与multichain有关…

leetcode 11.盛最多水的容器

题目描述 跳转到leetocde题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff…

RabbitMQ手动ACK与死信队列

为了保证消息从队列可靠的达到消费者,RabbitMQ 提供了消息确认机制(Message Acknowledgement)。 默认情况下RabbitMQ在消息发出后就立即将这条消息删除,而不管消费端是否接收到,是否处理完,导致消费端消息丢失时RabbitMQ自己又没有这条消息了…

spring-Bean管理-springboot原理-Maven高级

spring-Bean管理-springboot原理-Maven高级 配置优先级Bean管理1.获取bean2.bean作用域3.第三方bean SpringBoot原理Maven高级1.分模块设计与开发2.继承与聚合3.私服1.介绍2.资源上传与下载 配置优先级 优先级(低→高) application.yaml(忽略) application.yml appl…

利用Servlet编写第一个“hello world“(续)

利用Servlet编写第一个“hello world“ 🔎通过插件 Smart Tomcat 简化 打包代码 与 部署 操作下载Smart Tomcat配置Smart Tomcat 🔎Servlet 中的常见错误404(Not Found)🍭请求路径出错🍭war 包未被正确加载 405(Method Not Allowe…

【Android-JetpackCompose】13、实战在线课程 App

文章目录 一、BottomNavigation 底部导航1.1 底部导航栏的布局、点击1.2 设置 bottomBar 的颜色1.3 设置顶部 actionBar 的颜色 二、主页 StudyScreen2.1 顶部状态栏2.2 一、BottomNavigation 底部导航 1.1 底部导航栏的布局、点击 首先,构造 NavigationItem 的 d…

安装stable-diffusion

安装流程&#xff1a; 下载stable-diffusion源码 <https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.2.1>安装python <https://www.python.org/ftp/python/3.10.6/python-3.10.6-amd64.exe>添加host 打开C:\Windows\System32\drivers\etc…

django基于scrapy的音乐歌曲分析及推荐系统

而在线音乐网站作为一个网络载体&#xff0c;在音乐的传播&#xff0c;创作&#xff0c;欣赏等方面对音乐的发展产生了前所未有的影响—。 &#xff08;1&#xff09;电脑网络技术的发展使人们通过音乐网站接触到了多的音乐模式。 &#xff08;2&#xff09;网民数量的激增使更…

两台群晖NAS之间使用FTP或SFTP进行数据高速拷贝问题

两台群晖NAS之间使用FTP或SFTP进行数据高速拷贝问题 为了更好的浏览体验&#xff0c;欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 在有些时候&#xff0c;我们新买了一台全新群晖NAS需要把旧群晖NAS里的数据拷贝到新设备里&#xff0c;特别像电影、电视剧、小…

Python实战基础13-装饰器

1、先明白这段代码 第一波 def foo():print(foo)foo # 表示是函数 foo() # 表示执行foo函数第二波 def foo():print(foo)foo lambda x: x 1foo() # 执行lambda表达式&#xff0c;而不再是原来的foo函数&#xff0c;因为foo这个名字被重新指向了另外一个匿名函数函数名仅仅是…

攻不下dfs不参加比赛(九)

标题 为什么练dfs题目为什么练dfs 相信学过数据结构的朋友都知道dfs(深度优先搜索)是里面相当重要的一种搜索算法,可能直接说大家感受不到有条件的大家可以去看看一些算法比赛。这些比赛中每一届或多或少都会牵扯到dfs,可能提到dfs大家都知道但是我们为了避免眼高手低有的东…

Python入门(十三)函数(一)

函数&#xff08;一&#xff09; 1.函数概述2.函数定义2.1向函数传递信息2.2实参和形参 作者&#xff1a;xiou 1.函数概述 函数是带名字的代码块&#xff0c;用于完成具体的工作。要执行函数定义的特定任务&#xff0c;可调用该函数。需要在程序中多次执行同一项任务时&#…

win10微软Edge浏览器通过WeTab新标签页免费无限制使用ChatGPT的方法,操作简单,使用方便

目录 一、使用效果 二、注册使用教程 1.打开Edge浏览器扩展 2.选择Edge浏览器外接程序 3.搜索WeTab 4.进入管理扩展 5.启用扩展 ​编辑 6.进入WeTab新标签页 7.打开Chat AI 8.注册 9.使用 ChatGPT是OpenAI推出的人工智能语言模型&#xff0c;能够通过理解和学习人类…

opencv_c++学习(二十五)

一、Harris角点介绍 1、海瑞斯角点不可能出现在图像平滑的区域&#xff08;上图1&#xff09;&#xff1b; 2、图像边缘的支线出不可能出现海瑞斯角点&#xff08;上图2&#xff09;&#xff1b; 3、海瑞斯角点会出现在顶点处。&#xff08;上图3&#xff09;&#xff1b; 上图…

一文带你了解MySQL之redo日志

前言 本文以及接下来的几篇文章将会频繁的使用到我们前边唠叨的InnoDB记录行格式、页面格式、索引原理、表空间的组成等各种基础知识&#xff0c;如果大家对这些东西理解的不透彻&#xff0c;那么阅读下边的文字可能会特别的些费力&#xff0c;为保证您能正常的理解&#xff0…

Android 12系统源码_WindowInsets (一)WindowInsets相关类和功能介绍

一、什么是WindowInsets? WindowInsets源码解释为Window Content的一系列插值集合,可以理解为可以将其理解为不同的窗口装饰区域类型,比如一个Activity相对于手机屏幕需要空出的地方以腾给StatusBar、Ime、NavigationBar等系统窗口,具体表现为该区域需要的上下左右的宽高。…

Oracle Linux 8.8 发布 - Oracle 提供支持 RHEL 兼容发行版

Oracle Linux 8.8 发布 - Oracle 提供支持 RHEL 兼容发行版 Oracle Linux with Unbreakable Enterprise Kernel (UEK) & Red Hat compatible kernel (RHCK) 请访问原文链接&#xff1a;https://sysin.org/blog/oracle-linux-8/&#xff0c;查看最新版。原创作品&#xff…

opencv实践项目-图像卡通化

目录 1.如何使图像卡通画2.铅笔素描滤波器3. 细节增强滤波器4. 双边过滤器5. 铅笔边缘滤波器 1.如何使图像卡通画 我们通常需要执行两个主要步骤将图像转换为卡通图像&#xff1a;边缘检测和区域平滑。 边缘检测的主要目的显然是为了强调图像的边缘&#xff0c;因为卡通图像通…