当数据读取完毕后,我们要将数据描绘成波形并动态的显示出来。线程读取完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++;}
至此,数据波形的动态显示就完成了。
关注微信公众号 小白技术栈 | lakalako,获取更多的内容,欢迎大家关注哦!