当数据读取完毕后,我们要将数据描绘成波形并动态的显示出来。
线程读取完Excel表格数据后,发送request信号,触发槽函数showData(),此槽函数首先在chart上初始化前1024个点。
connect(&m_thread, &threadReadData::request, this, &MainWindow::showData);
void MainWindow::showData(const QVariant var)
{
// QList<QList<QVariant>> 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()<<row_count;
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<row_count;++i)
{
rowData = varRows[i].toList();
excel_list.push_back(rowData);
}//转换完毕
// qDebug()<<excel_list.at(2).at(2).toDouble();
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<Complex> inVec(1024);
QVector<Complex> 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++;
}
至此,数据波形的动态显示就完成了。