QTableWidget懒加载(动态加载)实现

博客介绍了QTableWidget数据加载卡顿问题的解决方法,采用懒加载,结合vector和map,在界面显示少量数据,滚动或插入数据时刷新。还重写了相关事件函数。此外,还介绍了一款股票监控软件,具备个股监测、大盘监测和股票推荐功能,并给出了下载地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在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)删除报警时也需要刷新

 

 

自己编了一个股票监控软件,有如下功能,有兴趣的朋友可以下载;

(1)   个股监测。监测个股实时变化,可以监测个股大单交易、急速拉升和下降、主力入场和出场、股票最高点和最低点提醒。检测到最高点、最低点、主力进场点、主力退场点、急速拉升点、急速下跌点,给出语音或者声音提醒,不用再时刻看着大盘了,给你更多自由的时间;

(2)   大盘监测。监测大盘的走势,采用上证、深证、创业三大指数的综合指数作为大盘走势。并实时监测大盘的最高点和最低点、中间的转折点。

(3)   股票推荐。还能根据历史数据长期或短期走势进行分析,对股市3千多个股票进行分析对比,选出涨势良好的股票,按照增长速度从大到小排序,推荐给你涨势良好的股票;

下载地址:

1.0.3版本(修复大盘指数崩溃缺陷)下载地址:

链接:https://pan.baidu.com/s/1BJcTp-kdniM7VE9K5Kd3vg 提取码:003h

更新链接:

https://www.cnblogs.com/bclshuai/p/10621613.html

转载于:https://www.cnblogs.com/bclshuai/p/9792362.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值