前一篇笔记中实现了QT的Label控件显示CPU的温度,只能显示当前的温度,并不能反映CPU温度的变化情况,现在来实现使用QT Charts的曲线图实现一个实时曲线来显示CPU的温度。
在原来的工程的中的pro文件中添加:
QT += charts
在dialog.h中添加Qt Charts的相关头文件,并添加Qt Charts的命名控件
#include <QtCharts/QChartGlobal>
QT_CHARTS_USE_NAMESPACE
在类声明中添加相关变量:
QChart *chart;
QChartView *ChartView;
QSplineSeries *series;
QList<double> temp_list;
uint16_t index;
上面的几个变量的前3个是Qt Charts中的类,下面3个是实现实时曲线中用到的变量。
首先实例化QChart,并隐藏了图例,把图表标题设置为CPU temperature:
QChart *chart = new QChart();
chart->legend()->hide();
chart->setTitle("CPU temperature");
接着创建两个坐标轴:x,y轴,分别添加到QChart的左边跟底部,X轴范围设置为:0-100,意思是QChart可见区域有101个点,Y轴范围设置为:20-80,意思是可现实的温度最小值为20摄氏度,最大值为80摄氏度。代码如下:
QValueAxis *axisX = new QValueAxis();
QValueAxis *axisY = new QValueAxis();
chart->addAxis(axisX, Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignLeft);
axisX->setRange(0, 100);
axisY->setRange(20, 80);
然后实例化曲线序列、添加到QChart中,并跟坐标轴关联起来:
series = new QSplineSeries();
chart->addSeries(series);
series->attachAxis(axisX);
series->attachAxis(axisY);
最后实例化QChartView并把QChart实例添加到QChartView中:
ChartView = new QChartView(chart);
ChartView->setRenderHint(QPainter::Antialiasing);
ui->container->addWidget(ChartView);
实现实时曲线的原理是,创建一个QList用作缓存:
QList<double> temp_list;
temp_list最多存储101个数据,当temp_list中的数据少于101时,有新数据的时候,把新数据添加到temp_list尾部,然后使用QSplineSeries的replace方法更新QSplineSeries的数据,如果temp_list中有了101个数据时,有新数据的话,先使用QList的removeFirst的方法删除temp_list第一个数据,然后使用append方法给temp_list添加数据,最后使用QSplineSeries的replace方法更新QSplineSeries的数据,就可以实现实时曲线了,代码如下:
void Dialog::update_chart(double temperature)
{
QList<QPointF> point_temp;
point_temp.clear();
temp_list.append(temperature);
if(temp_list.length() > 100)
{
temp_list.removeFirst();
for(int i=0;i<100;i++)
{
QPointF node(i,temp_list.at(i));
point_temp.append(node);
}
}else {
for(int i=0;i<temp_list.length();i++)
{
QPointF node(i,temp_list.at(i));
point_temp.append(node);
}
}
series->replace(point_temp);
}
运行结果如下:
同样是没修改代码,交叉编译后,在arm linux下运行如下:
手机扫一扫
移动阅读更方便
你可能感兴趣的文章