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下運行如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM