在QTableWidget中加入一行行的数据,如果数据数量过多,滚动起来就会卡顿,插入数据时也会影响性能,为了解决这个问题,采用懒加载的方式,只在界面上显示10几条数据,填满界面。同时增加而外的竖直滚动条,控制滚动条滑块的大小,给外界看到的效果就是有随着数据数量的增加,滚动条减小。滚动滚动条,或者插入新数据,都将界面中的数据删除,然后重新刷新一些。而且最新的显示在上面,历史的显示在下面。Vector中是按插入顺序从下排列,table中显示是按照插入顺序从下往上排列。

(1)      界面上添加QTableWidgetScrollBar

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懒加载(动态加载)实现的更多相关文章

  1. dubbo的jmeter压测时jar包的热加载/动态加载

    在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包 ...

  2. Java类的加载の动态

    类的加载方式 静态加载类,是编译时刻加载 动态加载类,是运行时刻加载 new创建对象:是静态加载类,在编译时刻就需要加载所有的可能使用到的类.有一个类有问题(如不存在),都不能通过编译,会报错. Cl ...

  3. 动态加载及Servlet容器加载

    动态加载 动态加载是 Servlet 3.0 中的新特性,它可以实现在不重启 Web 应用的情况下加载新的 Web 对象(Servlet.Filter.Listener). 为了实现动态加载的第一种方 ...

  4. 日志模块详细介绍 hashlib模块 动态加盐

    目录 一:hashlib模块 二:logging 一:hashlib模块 加密: 将明文数据通过一系列算法变成密文数据(目的就是为了数据的安全) 能够做文件一系列校验 python的hashlib提供 ...

  5. MUI - 解决动态列表页图片懒加载再次加载不成功的bug

    首先描述一下功能 实现列表页动态加载 通过官方提供的"下拉刷新和上拉刷新"及"图片懒加载"示例实现. http://www.cnblogs.com/philly ...

  6. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  7. 动态加载css方法实现和深入解析

    一.方法引用来源和应用  此动态加载css方法 loadCss,剥离自Sea.js,并做了进一步的优化(优化代码后续会进行分析).  因为公司项目需要用到懒加载来提高网站加载速度,所以将非首屏渲染必需 ...

  8. 携程Android App的插件化和动态加载框架

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  9. Vue加载组件、动态加载组件的几种方式

    https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...

  10. selenuim和phantonJs处理网页动态加载数据的爬取

    一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -* ...

随机推荐

  1. 使用SSH连接AWS服务器

    使用SSH连接AWS服务器 一直有一台AWS云主机,但是之前在Windows平台都是使用Xshell连接的,换到Ubuntu环境之后还没有试,昨天试了一下,终于使用SSH连接成功了,这里记录一下步骤: ...

  2. MFC之CImageList(1)

    CImageList BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow ); 其中各项参数的含义为:cx定义图像的宽度 ...

  3. apache备忘录

    apache多站点局域网访问: <VirtualHost *:80> DocumentRoot "E:/website/pxsj" ServerName host7.c ...

  4. app欢迎页问题

    今天替换app中的图片,打包成apk后,欢迎页的图片怎么替换都还是旧的,尝试多次以后,确定以及肯定是替换成功了的,而且替换的也都对,只好清理了一下项目,重新build,最后再打包,结果成功了!真是坑! ...

  5. ETL 工具和 BI 工具

    ETL是数据仓库中的非常重要的一环,是承前启后的必要的一步.ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为 ...

  6. celery:强大的定时任务模块

    什么是celery 还是一个老生常谈的话题,假设用户注册,首先注册信息入库,然后要调用验证码服务接口,然后根据手机号发送验证码,最后再返回响应给浏览器.但显然调用接口.发送验证码之后成功再给浏览器响应 ...

  7. CF981F 二分+Hall定理

    对于一个二分的答案 假设存在一个点集使得不满足Hall定理 题中给定的信息说明 左边每个点对应的右边点是一个区间 如果当前点集对应的右边区间是若干个不相交的区间组成的话说明我们还可以找到一个更小的点集 ...

  8. vue.js 简介

    Vue.js是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层 ...

  9. WPF绑定命令

    一.目的 降低代码耦合度(降低UI层和BLL层的代码耦合度),将UI层的后台代码更好的转移到BLL层中,让视图和业务逻辑分离的更好 二.使用方式 1.创建一个RelayCommand,继承IComma ...

  10. OpenGL相关文章

    OpenGL之glMatrixMode函数的用法 gluOrtho2D和glViewport的作用&窗口与显示的关系 glViewport函数用法 纹理映射