用QT 开发了一个上位机的工具用来解析串口的数据,数据量比较大 ,如果QT tableview 控件完全显示,内存消耗较大,所以解析结果先建立sql 数据索引,然后通过垂直滚动条的变化动态地获取数据,每次从数据库中提取50条,测试下来内存消耗较小,可以实现百万或者千万级的数据显示。
图一 主界面
1:先将垂直滚动条的valuechanged signal 和自定义的slot 绑定
QScrollBar *bar = ui->tableView->verticalScrollBar();
connect((QWidget*)bar,SIGNAL(valueChanged(int)),this,SLOT(acceptHScrollValueChanged(int)));
2:slot 传入垂直滚动条的位置值value 在线程中搜索数据。
void MainWindow::acceptHScrollValueChanged(int value)
{
{
model->removeRows(0,model->rowCount());
HScrollValueChanged(value,logFileName,TotalMessageNumber);
model->setRowCount(TotalMessageNumber);
}
}
3:线程中取出数据返回到UI中显示
void workThread::getTableData(int index,QString path,int totalMessagNum)
{
QVector< QVector<QString> > result ,result2;
int tableIndex=index;
if(!dbFlag)
{
_sqlDb.setDBName("./log/"+path+"/"+path+"_log.db");
_sqlDb.open("workThread");
dbFlag=true;
}
_sqlDb.getLogPointByIndex(tableIndex,result);
for(int i=0;i<result.size();i++)
{
QVector<QString> tmp(5);
for (int j = 0; j<5; ++j)
{
if(j==2)
{
// list << new QStandardItem(QString::number(result[i][2].toInt(),16));
tmp[2]=QString::number(result[i][2].toInt(),16);
}
else if(j==3)
{
MessageToIVI message=_database->getMessageToIVI(result[i][2].toInt());
tmp[3]=message.MessageName;
// list << new QStandardItem(messageName);
}
else if(j==4)
{
// list <<new QStandardItem(getMessagBodyByOffset(result[i][3].toInt()));
tmp[4]=getMessagBodyByOffset(result[i][3].toInt(),path);
}
else if(j==0)
{
tmp[0]=result[i][0];
}
else if(j==1)
{
tmp[1]=result[i][1];
}
}
result2.push_back(tmp);
}
emit UpdatehDataSignal(result2,tableIndex);
}
4:UI中显示数据库中显示的数据
void MainWindow::updateTableData(const QVector<QVector<QString> > result,int index)
{
#ifdef USER_MODE
qDebug()<<"updateTableData:"<<result.size();
userModel * model = (userModel *)ui->tableView->model();
RstData rstData;
rstData.retCode = 0;
rstData.result=result;
rstData.index = index;
model->handleResults(rstData);
// model->SetData(result,index);
#else
QStandardItemModel * model = (QStandardItemModel *)ui->tableView->model();
if (result.size() == 0)
return;
int start = index;
int col = result[0].size();
qDebug()<<"updateTableData inedex:"<<index<<"size:"<<result.size()<<"col:"<<col;
int row = result.size();
for (int i = 0; i<row; ++i)
{
QList<QStandardItem*> list;
for (int j = 0; j<5; ++j)
{
list <<new QStandardItem(result[i][j]);
}
model->insertRow(i + start, list);
for(int k=0;k<3;k++)
{
model->item(i + start, k)->setTextAlignment(Qt::AlignCenter);
}
}
model->setRowCount(TotalMessageNumber);
#endif
}
内存消耗才58兆
d5ebdede35e241b6b315794d27f37f82_noop
参考内容:文章来源:https://www.toymoban.com/news/detail-510639.html
https://blog.csdn.net/weixin_44575696/article/details/117407527?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_default&utm_relevant_index=2文章来源地址https://www.toymoban.com/news/detail-510639.html
到了这里,关于QT 实现百万级的数据显示内存消耗几十兆的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!