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