QTableWidget懒加载(动态加载)实现
在QTableWidget中加入一行行的数据,如果数据数量过多,滚动起来就会卡顿,插入数据时也会影响性能,为了解决这个问题,采用懒加载的方式,只在界面上显示10几条数据,填满界面。同时增加而外的竖直滚动条,控制滚动条滑块的大小,给外界看到的效果就是有随着数据数量的增加,滚动条减小。滚动滚动条,或者插入新数据,都将界面中的数据删除,然后重新刷新一些。而且最新的显示在上面,历史的显示在下面。Vector中是按插入顺序从下排列,table中显示是按照插入顺序从下往上排列。
(1) 界面上添加QTableWidget和ScrollBar
(2)创建vect保存数据的唯一编号,创建map按唯一编号保存数据。
vector <string> m_vectorLogid;
map<string,ALARMUIDATA> m_mapRealAlarm;
vector用来保存数据插入的顺序,而且能够按照数组的形式访问数据,但是查找数据只能遍历整个vecttor,所以不适合查找。因为map是按一定规则排序的,不是按照插入顺序排序的,但是map可以快速查找,需要结合两个实现懒加载。
(3)当需要改变界面中显示的数据时(有新的数据插入时,或者滚动条滚动时,或者界面放大缩小时,删除数据时),都要重新删除表格中数据,在加入数据。
void AlarmCenter::UpdateAlarmList()
{
//不用deleteallitem函数,会连表头都一起删除,deletecontent会保留插入的行框架,所以采用下面的形式删除插入数据。
int iAlarmCount = ui.tableWidget->rowCount();//删除现有的row
if (iAlarmCount > 0)
{
for (int i = 0; i < iAlarmCount; i++)
{
ui.tableWidget->removeRow(0);
}
}
//计算当前页面可以展示的条数
int rowHeight = ui.tableWidget->rowHeight(0);
if (rowHeight == 0)
{
rowHeight = 36;
}
//获取tableWidget的显示高度
int tableViewHeight = ui.tableWidget->height();
//计算一页可以显示的数据条数
int pagestep = tableViewHeight / rowHeight-1 ;//1是减去表头的高度
if (pagestep<0)
{
return;
}
//插入数据的总条数
int iMaxNum = AlarmDataManager::instance()->GetAlarmNum();
//滑块的当前位置(0开始)
m_sliderCurPosion = ui.verticalScrollBarAlarm->sliderPosition();
//根据当前的滑块位置,总的报警数量,一页显示报警数量,开始插入数据
for (int step =0;step<pagestep;step++)
{
//计算vector中的第一条显示的数据,step增加,index值减小,反向在vector中查找数据。
int index = iMaxNum - m_sliderCurPosion - step-1;
if (index<0|| index>=iMaxNum)//超出范围跳出
{
break;
}
ALARMUIDATA alarmData;
//根据index直接按照数组形式获取唯一标示logid,然后根据logid去map中找数据返回。
if (AlarmDataManager::instance()->GetAlarmByIndex(alarmData,index)!=HPR_OK)
{
LOGIC_ERROR("Can't find alarmdata by index %d", index);
continue;
}
//插入一条数据
ui.tableWidget->insertRow(step); //插入新行
AddAlarmToWidget(alarmData,index,step);
}
//总数量大于一页显示数量时,显示滚动条,设置滚动条范围,控制滑块大小
if (iMaxNum>pagestep)
{
ui.verticalScrollBarAlarm->setMaximum(iMaxNum - pagestep);
ui.verticalScrollBarAlarm->show();
//LOGIC_INFO("maxnum %d,sliderposion %d", ui.verticalScrollBarAlarm->maximum(),ui.verticalScrollBarAlarm->sliderPosition());
}
else
{
ui.verticalScrollBarAlarm->hide();
}
}
(4)重写resizeevent函数
void AlarmCenter::resizeEvent(QResizeEvent* size)
{
//一页显示的数量会变化,所以要刷新
UpdateAlarmList();
}
(1) 重写wheelEvent函数
void AlarmCenter::wheelEvent(QWheelEvent * event)
{
if (event->x()>ui.alarmCenter->width())//如果鼠标在右侧窗口上,则不滚动左边报警列表;
{
return;
}
int tableViewHeight = ui.tableWidget->height();
int pagestep = tableViewHeight / 36 - 1;//1是减去表头的高度
//插入数据报警总数
int iMaxNum = AlarmDataManager::instance()->GetAlarmNum();
if (iMaxNum<pagestep)//总数小于页面显示数量,则滚动无效
{
return;
}
if (event->delta() > 0) //向下滚动
{
m_sliderCurPosion -= 1;
if (m_sliderCurPosion < 0)
{
m_sliderCurPosion = 0;
return;
}
}
else///向上滚动
{
m_sliderCurPosion += 1;
if (m_sliderCurPosion > ui.verticalScrollBarAlarm->maximum())
{
m_sliderCurPosion = ui.verticalScrollBarAlarm->maximum();
return;
}
}
//更新滑块位置
ui.verticalScrollBarAlarm->setSliderPosition(m_sliderCurPosion);
//更新表格信息
UpdateAlarmList();
}
(6)删除报警时也需要刷新
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:
https://www.cnblogs.com/bclshuai/p/11380657.html
百度云盘下载地址:
链接:https://pan.baidu.com/s/1swkQzCIKI3g3ObcebgpIDg
提取码:mc8l
微信公众号获取最新的软件和视频介绍
QStockView
QTableWidget懒加载(动态加载)实现的更多相关文章
- dubbo的jmeter压测时jar包的热加载/动态加载
在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包 ...
- Java类的加载の动态
类的加载方式 静态加载类,是编译时刻加载 动态加载类,是运行时刻加载 new创建对象:是静态加载类,在编译时刻就需要加载所有的可能使用到的类.有一个类有问题(如不存在),都不能通过编译,会报错. Cl ...
- 动态加载及Servlet容器加载
动态加载 动态加载是 Servlet 3.0 中的新特性,它可以实现在不重启 Web 应用的情况下加载新的 Web 对象(Servlet.Filter.Listener). 为了实现动态加载的第一种方 ...
- 日志模块详细介绍 hashlib模块 动态加盐
目录 一:hashlib模块 二:logging 一:hashlib模块 加密: 将明文数据通过一系列算法变成密文数据(目的就是为了数据的安全) 能够做文件一系列校验 python的hashlib提供 ...
- MUI - 解决动态列表页图片懒加载再次加载不成功的bug
首先描述一下功能 实现列表页动态加载 通过官方提供的"下拉刷新和上拉刷新"及"图片懒加载"示例实现. http://www.cnblogs.com/philly ...
- 携程Android App插件化和动态加载实践
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- 动态加载css方法实现和深入解析
一.方法引用来源和应用 此动态加载css方法 loadCss,剥离自Sea.js,并做了进一步的优化(优化代码后续会进行分析). 因为公司项目需要用到懒加载来提高网站加载速度,所以将非首屏渲染必需 ...
- 携程Android App的插件化和动态加载框架
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- Vue加载组件、动态加载组件的几种方式
https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...
- selenuim和phantonJs处理网页动态加载数据的爬取
一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -* ...
随机推荐
- Centos7:MyCat安装,配置及使用
解压缩 使用,默认端口8066 ./mycat start //启动 ./mycat stop //停止 ./mycat restart //重启
- 使用原生node.js搭建HTTP服务器,支持MP4视频、图片传输,支持下载rar文件
前言 如何安装node.js,如何搭建一个简易的http服务器我这里就不再赘述了,不懂的同学可以先去学习一下.当然了,我写的也就属于简易版的增强版,大家有什么高见的欢迎提出,然后进入正题. 目录结构 ...
- Linux--目录属性
目录的读属性:表示具有读取目录结构清单的权限.使用ls命令可以将该目录中的文件和子目录的内容列出来. 目录的写属性:表示具有更改目录结构清单的权限.包括以下操作: 建立新的文件与目录 删除已经存在的文 ...
- Java 访问 C++ 方法:JavaCPP
JavaCPP提供了在Java中高效访问本地C++的方法.采用JNI技术实现,支持所有Java实现包括Android系统,Avian 和 RoboVM. JavaCPP提供了一系列的Annotatio ...
- ANSIBLE自动化管理工具
ansible 基础 自动化运维工具 官网:https://www.ansible.com/ 官方文档:https://docs.ansible.com/ ansible 特性 1. 模块化:调用特定 ...
- IoU-Net论文笔记
原论文标题:Acquisition of Localization Confidence for Accurate Object Detection 1. 前言 Megvii在ECCV 2018上的一 ...
- OSI七层协议模型、TCP/IP四层模型
OSI七层协议模型 TCP/IP四层模型 首先我们梳理一下每层模型的职责: 链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据: 网络层:定义IP地址,确认主机所在的网络位置,并通过I ...
- Rails 用Webpack安装Bootstrap(附录webpack使用)
Rails6将默认使用webpack代替asset: 本文讲述如何自己配置. 参考: https://getbootstrap.com/docs/4.1/getting-started/webpack ...
- MyBatis 分页插件PageHelper 后台报错
今天遇到一个问题,使用MyBatis 分页插件PageHelper 进行排序分页后,能正常返回正确的结果,但后台却一直在报错 net.sf.jsqlparser.parser.ParseExcepti ...
- Spring事务源码分析
首先看例子,这例子摘抄自开涛的跟我学spring3. @Test public void testPlatformTransactionManager() { DefaultTransactionDe ...