Linux 中使用 QT Charts 显示温度传感器

前一篇笔记中实现了QT的Label控件显示CPU的温度,只能显示当前的温度,并不能反映CPU温度的变化情况,现在来实现使用QT Charts的曲线图实现一个实时曲线来显示CPU的温度。

添加对Qt Chart的支持

在原来的工程的中的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个是实现实时曲线中用到的变量。

初始化Qt Charts部分

首先实例化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);

实现更新QChart函数

实现实时曲线的原理是,创建一个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 中运行

同样是没修改代码,交叉编译后,在arm linux下运行如下:

posted @ 2021-05-13 08:54  哈拎  阅读(542)  评论(0编辑  收藏  举报