近期想要做个上位机显示SDR设备的信号频谱,频谱瀑布图展示最为直观,经过多方评估比较最后选择了QCustomsplot图形库,相比于其他选择比如修改RGB像素刷新图片来说这种方式要简单的多,先做了个demo出来试试效果,话不多说先上动图。
下面介绍方方法:
第一步,QT没有自带QCustomplot库需要自行下载,实际上就是一个qcustomplot.h和qcustomplot.cpp文件,添加进工程就可以了,不想下载的后面我会上传demo工程里面就包含有这连个文件。
第二步,绘制最上边瀑布图界面分三步
1,.ui中拖入QWidget控件 2,控件提升为qcustomplot类,3,编写初始化以及显示代码
初始化及刷新代码如下:其中F_domain_init()为初始化窗口,F_Show()为刷新窗口
void MainWindow::F_domain_init()
{
fp3 = ui->widget; //创建一个画图指针
fp3->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom);//可拖拽+可滚轮缩放
m_pColorMap = new QCPColorMap(fp3->xAxis,fp3->yAxis);
m_pColorMap->data()->setSize(xlength+1,51);//设置整个图(x,y)点数
m_pColorMap->data()->setRange(QCPRange(0,xlength),QCPRange(0,100));//setRange是设置X轴以及Y轴的范围
m_pColorMap->setGradient(QCPColorGradient::gpJet);//设置默认渐进色变化(可在QCPColorGradient中查看)
m_pColorMap->rescaleDataRange(true);
// 立即刷新图像
fp3->rescaleAxes();//自适应大小
// ui->widget->replot();
}
void MainWindow::F_show(QVector data) //显示lofar瀑布图
{
if(value_lofar.size()>49)
{
value_lofar.removeLast(); //当lofar累积到了50个,删除最后面的数据,防止绘图溢出绘图区域
}
value_lofar.prepend(data);//新来的数据一直往前面累加
for (int i=0;idata()->setCell(j,i,value_lofar[i][j]);
}
}
m_pColorMap->rescaleDataRange(true);
fp3->rescaleAxes();//自适应大小
ui->widget->replot();
}
第三步,绘制中间柱状离谱界面也有三步
1,.ui中再拖入QWidget控件 2,控件提升为qcustomplot类,3,编写初始化以及显示代码
初始化及刷新代码如下:其中Bars_domain_init()为初始化窗口,Bars_Show()为刷新窗口
void MainWindow::Bars_domain_init()
{
QCPAxis *keyAxis = ui->widget_QCPBars->xAxis;
QCPAxis *valueAxis = ui->widget_QCPBars->yAxis;
fossil = new QCPBars(keyAxis, valueAxis); // 使用xAxis作为柱状图的key轴,yAxis作为value轴
fossil->setAntialiased(false); // 为了更好的边框效果,关闭抗齿锯
fossil->setName("Fossil fuels"); // 设置柱状图的名字,可在图例中显示
fossil->setPen(QPen(QColor(0, 168, 140).lighter(130))); // 设置柱状图的边框颜色
fossil->setBrush(QColor(0, 168, 140)); // 设置柱状图的画刷颜色
keyAxis->setRange(0, xlength); // 设置范围
keyAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);
valueAxis->setRange(0, 100);
}
void MainWindow::Bars_show(QVector fossilData)
{
QVector ticks;
for(int i=1;i<=xlength;i++)
{
ticks << i;
}
fossil->setData(ticks,fossilData);
ui->widget_QCPBars->replot();
}
第四步,绘制最下边时域界面还是三步
1,.ui中再拖入QWidget控件 2,控件提升为qcustomplot类,3,编写初始化以及显示代码
初始化及刷新代码如下:其中T_domain_init()为初始化窗口,T_Show()为刷新窗口
void MainWindow::T_domain_init()
{
CustomPlot->addGraph();
CustomPlot->graph(0)->setPen(QPen(Qt::red));
//CustomPlot->xAxis->setLabel("t");
//CustomPlot->yAxis->setLabel("mV");
CustomPlot->xAxis->setRange(0,xlength);
CustomPlot->yAxis->setRange(0,100);
CustomPlot->replot();
}
void MainWindow::T_Show(QVector data)
{
QVector xx;
for(int i=0;igraph(0)->setData(xx,data);
CustomPlot->replot();
}
完成以上四步后 三个显示画面就已经有了,怎样显示数据呢,且听下回分解。。。。。哈哈哈哈
第五步,定时刷新显示数据
起个定时器就三行代码我就不写了,直接写刷新函数updata()
void MainWindow::update()
{
QVector data;
static double f = qrand()%100;
f = f +2;
for(int i=0;i
这个函数里边的内容我略微介绍下,首先产生要刷新的data数据,数据类型QVector
OK,以上就是完成开头动图展示的有需要的代码片段,需要完整工程的留邮箱,有CSDN积分的支持下:点击这里下载demo