串口数据波形显示_项目【QT5.13频谱分析软件】(四)——数据动态波形显示

7744a3a45aedaf4f22c8b1f5d0984c10.png

当数据读取完毕后,我们要将数据描绘成波形并动态的显示出来。线程读取完Excel表格数据后,发送request信号,触发槽函数showData(),此槽函数首先在chart上初始化前1000个点。
connect(&m_thread, &threadReadData::request, this, &MainWindow::showData);
void MainWindow::showData(const QVariant var){//    QList> excel_list;//用于将QVariant转换为Qlist的二维数组    QVariantList varRows=var.toList();    if(varRows.isEmpty())    {        QMessageBox::information(nullptr, "错误", "数据表格为空,\n请重新选择!",                                 QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);        ui->actionOpen->setEnabled(true);        progressBarValue = 0;        ui->progressBar->setValue(progressBarValue);        progressBarTimer.stop();        return;    }    const int row_count = varRows.size();    qDebug()<    ui->labelRows->setNum(row_count);    QString str = QString::number(row_count, 10);    ui->lineEditEnd->setText(str);    ui->lineEditEnd->setEnabled(false);    max_count = row_count;    QVariantList rowData;    excel_list.clear();    for(int i=0;i    {        rowData = varRows[i].toList();        excel_list.push_back(rowData);    }//转换完毕//    qDebug()<    progressBarValue = 100; //数据读取完成,进度条显示100%    ui->checkBoxLP->setEnabled(true);    ui->checkBoxBP->setEnabled(true);    ui->checkBoxHP->setEnabled(true);    m_buffer.reserve(1000);    for (int i = 0; i < 1000; ++i)        m_buffer.append(QPointF(i, 0));    for(int i = 0; i < 1000; i++)    {        m_buffer[i].setY(excel_list.at(i).at(2).toDouble());    }    chartData->m_series->replace(m_buffer);}
在主函数中 建立定时器信号槽机制,由开始按钮触发定时器,当点击按钮时, 定时器 开始刷新 波形。
connect(&chartDataTimer, &QTimer::timeout, this, &MainWindow::handleTimeout);chartDataTimer.setInterval(mscChanged);
开始按钮打开定时器函数
void MainWindow::on_actionStart_triggered(){    ui->actionOpen->setEnabled(false);    ui->actionStart->setEnabled(false);    ui->actionPause->setEnabled(true);    ui->actionStop->setEnabled(false);    ui->actionForward->setEnabled(true);    ui->actionBackward->setEnabled(true);    chartDataTimer.start();}

定时器触发槽函数handleTimeout(),此函数负责刷新波形,在添加数据点之前要先判断数据是否超出范围,防止数据溢出出现程序崩溃。

void MainWindow::handleTimeout(){    qreal x = chartData->plotArea().width() / chartData->m_axisX->tickCount();    m_buffer.reserve(100);    if(1000 + 100 * chartDataCount >= max_count - 100)  //防止数据溢出    {        chartDataTimer.stop();        return;    }    for (int i = 1000+100*chartDataCount; i < 1000+100*(chartDataCount+1); ++i)    {        m_buffer.append(QPointF(i, 0));    }    for (int i = 1000+100*chartDataCount; i < 1000+100*(chartDataCount+1); ++i)    {        m_buffer[i].setY(excel_list.at(i).at(2).toDouble());    }    chartData->m_series->replace(m_buffer);    chartData->scroll(x, 0);    QVector inVec(1024);    QVector outVec(1024);    qreal temp[512], mymax, mymin;    for (int i = 0+100*chartDataCount; i < 1024+100*chartDataCount; i++)            inVec[i-100*chartDataCount].rl = excel_list.at(i).at(2).toDouble();    myfft.fft1(inVec, 1024, outVec);    m_bufferFFT.reserve(512);    for (int i = 0; i < 512; i++)    {        m_bufferFFT.append(QPointF(i, 0));        temp[i] = qAbs(outVec[i].rl);    }    mymax = *max_element(temp, temp + 512);    mymin = *min_element(temp, temp + 512);    for(int i = 0; i < 512; i++)    {        m_bufferFFT[i].setY((temp[i] - mymin) / (mymax - mymin));    }    QString _valueLP = ui->lineEditLP->text();    QString _valueHP = ui->lineEditHP->text();    int valueLP = _valueLP.toInt();    int valueHP = _valueHP.toInt();    if(ui->checkBoxLP->isChecked() == true)    {        for(int i = valueLP; i < 512; i++)        {            m_bufferFFT[i].setY(0);        }    }    if(ui->checkBoxBP->isChecked() == true)    {        for(int i = 0; i < valueLP; i++)        {            m_bufferFFT[i].setY(0);        }        for(int i = valueHP; i < 512; i++)        {            m_bufferFFT[i].setY(0);        }    }    if(ui->checkBoxHP->isChecked() == true)    {        for(int i = 0; i < valueHP; i++)        {            m_bufferFFT[i].setY(0);        }    }    m_bufferFFT[0].setY(0); //去除直流分量    chartFFT->m_series->replace(m_bufferFFT);    m_bufferFFT.clear();    chartDataCount++;}

至此,数据波形的动态显示就完成了。

efec6887c21286b3826b750b1f2558a9.png

关注微信公众号 小白技术栈 | lakalako,获取更多的内容,欢迎大家关注哦!

4e832dbbe927b331b88671bdeed52a27.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值