QT 实现百万级的数据显示内存消耗几十兆

用QT 开发了一个上位机的工具用来解析串口的数据,数据量比较大 ,如果QT tableview 控件完全显示,内存消耗较大,所以解析结果先建立sql 数据索引,然后通过垂直滚动条的变化动态地获取数据,每次从数据库中提取50条,测试下来内存消耗较小,可以实现百万或者千万级的数据显示。

   e5dd66c733084e1ca50ed53660c5bf2f.png  图一 主界面

 

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://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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值