????????要想使用 Qt Charts,我們的 Qt 版本得使用 Qt 5.7 之后的版本。其實 Qt Charts 并不是 Qt 5.7 才有的,是在 Qt 5.7 以前只有商業(yè)版本的 Qt 才有 Qt Charts。我們能免費下載的 Qt 版本都是社區(qū)(開源)版本。
????????Qt Charts 很方便的繪制我們常見的曲線圖、折線圖、柱狀圖和餅狀圖等圖表。不用自己花精力去了解第三方組件的使用了或者開發(fā)第三方組件。Qt 的幫助文檔里已經(jīng)有說明 Qt Charts 主要部件的使用方法。需要用到時我們可以查看 Qt 文檔就可以了。
????????下面我們主要簡介一下 Qt Charts 模塊,首先先看它的繼承關系,(看繼承關系可以了解這 個類是怎么來的,它不可能是一下子崩出來的)。
????????至于怎么查看 QChart 類的繼承關系,使用Ctrl + Shift + T ,點擊要查詢的類的繼承關系。
????????要想在項目里使用 Qt Charts 模塊,需要在 pro 文件下添加以下語句。
QT += charts
?????????如果我們點擊查看 Qt Charts 類,我們可以看到要想使用 Qt Charts 類,除了需要包括相應 的頭文件外,還需要使用命名空間,格式如下。
QT_CHARTS_USE_NAMESPACE
????????或者在頭文件類外加上以下語句。
using namespace QtCharts;
????????下面我們直接開始例子,了解一下 Qt Charts 的使用。
應用實例
????????本例目的:快速了解 Qt Charts 的使用。例子非常實用,除了可以繪制靜態(tài)曲線,也可以繪 制動態(tài)曲線。例子可以直接應用到實際項目中利用提供接口讀取數(shù)據(jù)繪制動態(tài)曲線圖。
????????項目名稱:qtchart_test,實時動態(tài)曲線?;玖鞒倘缦拢菏褂靡粋€ QSplineSeries 對象(曲線),一個QChart(圖表),一個 QChartView(圖表視 圖)。首先我們創(chuàng)建?chart 圖表,然后創(chuàng)建兩條坐標軸 axisX 與 axisY。將兩條坐標軸添加到 chart 圖表上,再將 splineSeries 曲線與坐標軸連系起來。最后再將 chart 圖表添加到 chartView 圖表視圖中。曲線上的數(shù)據(jù)由系統(tǒng)產(chǎn)生隨機數(shù),使用定時器更新數(shù)據(jù)。
????????項目文件 qtchart_test.pro 文件第一行添加的代碼部分如下。
QT += core gui charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
????????在頭文件“mainwindow.h”具體代碼如下。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QChartView>
#include <QSplineSeries>
#include <QScatterSeries>
#include <QDebug>
#include <QValueAxis>
#include <QTimer>
#include <QMainWindow>
/* 必需添加命名空間 */
QT_CHARTS_USE_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
/* 接收數(shù)據(jù)接口 */
void receivedData(int);
/* 數(shù)據(jù)最大個數(shù) */
int maxSize;
/* x軸上的最大值 */
int maxX;
/* y軸上的最大值 */
int maxY;
/* y軸 */
QValueAxis *axisY;
/* x軸 */
QValueAxis *axisX;
/* QList int類型容器 */
QList<int> data;
/* QSplineSeries對象(曲線)*/
QSplineSeries *splineSeries;
/* QChart圖表 */
QChart *chart;
/* 圖表視圖 */
QChartView *chartView;
/* 定時器 */
QTimer *timer;
private slots:
void timerTimeOut();
};
#endif // MAINWINDOW_H
????????在源文件“mainwindow.cpp”具體代碼如下。文章來源:http://www.zghlxwxcb.cn/news/detail-531676.html
#include "mainwindow.h"
#include <QDateTime>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 設置最顯示位置與大小 */
this->setGeometry(0, 0, 800, 480);
/* 最大儲存maxSize - 1個數(shù)據(jù) */
maxSize = 51;
/* x軸上的最大值 */
maxX = 5000;
/* y軸最大值 */
maxY = 40;
/* splineSeries曲線實例化(折線用QLineSeries) */
splineSeries = new QSplineSeries();
/* 圖表實例化 */
chart = new QChart();
/* 圖表視圖實例化 */
chartView = new QChartView();
/* 坐標軸 */
axisY = new QValueAxis();
axisX = new QValueAxis();
/* 定時器 */
timer = new QTimer(this);
/* legend譯圖例類型,以繪圖的顏色區(qū)分,本例設置為隱藏 */
chart->legend()->hide();
/* chart設置標題 */
chart->setTitle("實時動態(tài)曲線示例");
/* 添加一條曲線splineSeries */
chart->addSeries(splineSeries);
/* 設置顯示格式 */
axisY->setLabelFormat("%i");
/* y軸標題 */
axisY->setTitleText("溫度/℃");
/* y軸標題位置(設置坐標軸的方向) */
chart->addAxis(axisY, Qt::AlignLeft);
/* 設置y軸范圍 */
axisY->setRange(0, maxY);
/* 將splineSeries附加于y軸上 */
splineSeries->attachAxis(axisY);
/* 設置顯示格式 */
axisX->setLabelFormat("%i");
/* x軸標題 */
axisX->setTitleText("時間/ms");
/* x軸標題位置(設置坐標軸的方向) */
chart->addAxis(axisX, Qt::AlignBottom);
/* 設置x軸范圍 */
axisX->setRange(0, maxX);
/* 將splineSeries附加于x軸上 */
splineSeries->attachAxis(axisX);
/* 將圖表的內(nèi)容設置在圖表視圖上 */
chartView->setChart(chart);
/* 設置抗鋸齒 */
chartView->setRenderHint(QPainter::Antialiasing);
/* 設置為圖表視圖為中心部件 */
setCentralWidget(chartView);
/* 定時200ms */
timer->start(200);
/* 信號槽連接 */
connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));
/* 設置隨機種子,隨機數(shù)初始化 */
qsrand(time(NULL));
}
MainWindow::~MainWindow()
{
}
void MainWindow::timerTimeOut()
{
/* 產(chǎn)生隨機0~maxY之間的數(shù)據(jù) */
receivedData(qrand() % maxY );
}
void MainWindow::receivedData(int value)
{
/* 將數(shù)據(jù)添加到data中 */
data.append(value);
/* 當儲存數(shù)據(jù)的個數(shù)大于最大值時,把第一個數(shù)據(jù)刪除 */
while (data.size() > maxSize) {
/* 移除data中第一個數(shù)據(jù) */
data.removeFirst();
}
/* 先清空 */
splineSeries->clear();
/* 計算x軸上的點與點之間顯示的間距 */
int xSpace = maxX / (maxSize - 1);
/* 添加點,xSpace * i 表示第i個點的x軸的位置 */
for (int i = 0; i < data.size(); ++i) {
splineSeries->append(xSpace * i, data.at(i));
}
}
? ? ? ?receivedData(int value)函數(shù)是實現(xiàn)曲線移動的代碼,代碼算法是,當數(shù)據(jù)的個數(shù)超過最大值后, 我們就刪除第一個數(shù)據(jù),如此反復,就實現(xiàn)了數(shù)據(jù)移動的過程,同時圖表視圖中的曲線因為值的改變實現(xiàn)了“移動”。文章來源地址http://www.zghlxwxcb.cn/news/detail-531676.html
程序運行效果?????????
到了這里,關于【嵌入式Qt開發(fā)入門】如何使用Qt進行繪制實時圖表——QChart 圖表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!