前一篇筆記中實現了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下運行如下: