上次实现了采集温度数据通过串口发送到电脑,然后在上位机实现波形显示。
这次填一下上次的坑。也算改一下上次的bug。
上位机采集数据量变多后就会变得很卡。单条曲线接收几千个数据后就可以看出明显卡顿。
网上给出的解决方法是使用OpenGL加速画图,这样可以牺牲性能换取速度。开启方法也很简单 series->setUseOpenGL(true);就可以了。
不过性能提示也很有限,大概在两万个点后重新发生卡顿现象。
后来了解到使用第三方绘图控件QCustomPlot
QCustomPlot官网链接:
https://www.qcustomplot.com/index.php/introduction
下载最新的2.11版本,解压后得到的qcustomplot.h和qcustomplot.cpp拷贝到项目目录下,别忘了在.pro文件中添加相关文件
然后防置个QWidget 转换为 QCustomPlot。
QCustomPlot的几个重要类
QCustomPlot 图表类:用于图表的显示和交互;
QCPLayer 图层:管理图层元素(QCPLayerable),所有可显示的对象都是继承自图层元素;
QCPAbstractPlottable 绘图元素:包含 折线图(QCPGraph)、曲线图(QCPCurve)、柱状图(QCPBars)、QCPStatiBox(盒子图)、QCPColorMap(色谱图)、QCPFinancial(金融图);
QCPAxisRect 坐标轴矩形:一个坐标轴矩形默认包含上下左右四个坐标轴,但是可以添加多个坐标轴;
添加个实例代码看看
// 生成数据,画出的是抛物线
QVector<double> x(101), y(101); //初始化向量x和y
for (int i=0; i<101; ++i)
{
x[i] = i/50.0 - 1; // x范围[-1,1]
y[i] = x[i]*x[i]; // y=x*x
}
ui->customPlot->addGraph();//添加数据曲线(一个图像可以有多个数据曲线)
// graph(0);可以获取某个数据曲线(按添加先后排序)
// setData();为数据曲线关联数据
ui->customPlot->graph(0)->setData(x, y);
ui->customPlot->graph(0)->setName("第一个示例");// 设置图例名称
// 为坐标轴添加标签
ui->customPlot->xAxis->setLabel("x");
ui->customPlot->yAxis->setLabel("y");
// 设置坐标轴的范围,以看到所有数据
ui->customPlot->xAxis->setRange(-1, 1);
ui->customPlot->yAxis->setRange(0, 1);
ui->customPlot->legend->setVisible(true); // 显示图例
// 重画图像
ui->customPlot->replot();
实测数据五十万还是很流畅运行。
|