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

2022-02-23 21:03:35 字數 4069 閱讀 8050

在qtablewidget中加入一行行的資料,如果資料數量過多,滾動起來就會卡頓,插入資料時也會影響效能,為了解決這個問題,採用懶載入的方式,只在介面上顯示10幾條資料,填滿介面。同時增加而外的豎直滾動條,控制滾動條滑塊的大小,給外界看到的效果就是有隨著資料數量的增加,滾動條減小。滾動滾動條,或者插入新資料,都將介面中的資料刪除,然後重新重新整理一些。而且最新的顯示在上面,歷史的顯示在下面。vector中是按插入順序從下排列,table中顯示是按照插入順序從下往上排列。

(1)介面上新增qtablewidgetscrollbar

2)建立vect儲存資料的唯一編號,建立map按唯一編號儲存資料。

vector m_vectorlogid;

mapm_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//計算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 (imaxnumreturn;

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)刪除報警時也需要重新整理

提取碼:mc8l

mysql懶載入 mybatis懶載入

1.概念 懶載入就是按需載入,我們需要什麼的時候再去進行什麼操作。而且先從單錶查詢,需要時再從關聯表去關聯查詢,能很大提高資料庫效能,因為查詢單錶要比關聯查詢多張表速度要快。在mybatis中,resultmap可以實現高階對映 使用association collection實現一對一及一對多對映...

路由懶載入與元件懶載入

一 為什麼要使用路由懶載入 為給客戶更好的客戶體驗,首屏元件載入速度更快一些,解決白屏問題。二 定義 懶載入簡單來說就是延遲載入或按需載入,即在需要的時候的時候進行載入。三 使用 常用的懶載入方式有兩種 即使用vue非同步元件 和 es中的import 1 不用懶載入,vue中路由 如下 impor...

路由懶載入和元件懶載入

為給客戶更好的客戶體驗,首屏元件載入速度更快一些,解決白屏問題。二 定義 懶載入簡單來說就是延遲載入或按需載入,即在需要的時候的時候進行載入。三 使用 常用的懶載入方式有兩種 即使用vue非同步元件和es中的import 1 未用懶載入,vue中路由 如下 import vue from vue i...