QTableWidget懶加載(動態加載)實現


  在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM