最近要使用Qtablewidget保存4300多的數據,發現以下刷新4300條數據,界面會變得非常卡頓,於是想了優化一下;因爲要對所有數據排序,想用一下Qtablewidget自動排序功能,而且數據量不多,不想採用動態加載的方式來實現;
方法1複用內存,不重複清除創建
以前每次都會清除,然後重新創建對象,寫數據,發現重新pIterm = new QTableWidgetItem;非常耗時,導致界面卡頓;於是想複用已經創建的QTableWidgetItem,插入數據時,先獲取Qtablewidget的item,直接在上面寫數據;發現速度快了很多;
void QStockView::SlotUpdateHisDataTable(map<QString, HisAnalyzeInfo>& mapHisAnalyze) { m_bUpdatingHisTable = true; //ui.tableWidgetHis->setUpdatesEnabled(false); //刪除內容 int RowCount = ui.tableWidgetHis->rowCount(); /*while (rownum > 0)//刪除重新插入比較耗時 { ui.tableWidgetHis->removeRow(0); rownum--; }*/ //ui.tableWidgetHis->setColumnCount(10); map<QString, HisAnalyzeInfo>::iterator it = mapHisAnalyze.begin(); QTableWidgetItem* pIterm = NULL; int rownum = 0; //先插入已經存在的 for (;it!= mapHisAnalyze.end();it++) { int colum = 0; if (RowCount>0) { //第0行是複選框,從1開始 ui.tableWidgetHis->setRowHidden(rownum, false); colum = 1; pIterm = ui.tableWidgetHis->item(rownum,colum++);//代碼 if (pIterm != NULL) { QString strStockCode = it->second.strCode; strStockCode = strStockCode.right(6); pIterm->setText(strStockCode); } RowCount--;//可用行數減一 } else//插入新的數據 { ui.tableWidgetHis->insertRow(rownum); /*QCheckBox* pCheckBox = new QCheckBox(); pCheckBox->setFixedWidth(20); pCheckBox->setChecked(false); ui.tableWidgetHis->setCellWidget(rownum, colum++, pCheckBox);*/ pIterm = new QTableWidgetItem; pIterm->setCheckState(Qt::Unchecked); ui.tableWidgetHis->setItem(rownum, colum++, pIterm); pIterm = new QTableWidgetItem; if (pIterm != NULL) { QString strStockCode = it->second.strCode; strStockCode = strStockCode.right(6); pIterm->setText(strStockCode); } } rownum++; } if (RowCount > 0)//隱藏多餘的行 { for (int i=0;i<RowCount;i++) { ui.tableWidgetHis->setRowHidden(rownum+i,true); } } //Slotsortbyclounm(m_sortCloum);//隱藏和排序同時使用時會導致錯亂,Qtablewidget->setRowHidden()將無效該隱藏的行沒有隱藏;,所以這裏註釋掉 m_bUpdatingHisTable = false; }
(2)經過上述方法發現,當數據量是4000多時,雖然複用了內存空間,重新刷新一次也要十幾秒的時間,而且界面會卡住無響應
原因竟然是第一列採用QCheckBox* pCheckBox = new QCheckBox();插入的複選框,導致刷新數據會非常卡,換成了QTableWidgetItem(pIterm = new QTableWidgetItem; pIterm->setCheckState(Qt::Unchecked))自帶的checkbox功能後,用統一的QTableWidgetItem去寫數據,不用自定義的widget去設置,速度會很快,4000多條數據1秒之後就加載完成,非常快。也不卡;
遇到的問題
當Qtablewidget->setRowHidden()之後緊跟排序Slotsortbyclounm(m_sortCloum),setRowHidden()將會無效,導致無法隱藏想要隱藏的行;可以考慮用信號槽去關聯,或者等到隱藏結束,豎向滾動條的範圍發生改變時,再去排序;
Slotsortbyclounm(m_sortCloum);//隱藏和排序同時使用時會導致錯亂,Qtablewidget->setRowHidden()將無效該隱藏的行沒有隱藏;,所以這裏註釋掉 m_bUpdatingHisTable = false; }
如果對軟件感興趣,可維新共總好:QStockView 獲取;