最近要使用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 获取;



















