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