欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt使用QChart實現(xiàn)動態(tài)顯示溫度變化曲線

 更新時間:2023年06月02日 14:37:14   作者:DS小龍哥  
Qt的QChart是一個用于繪制圖表和可視化數(shù)據(jù)的類,提供了一個靈活的、可擴(kuò)展的、跨平臺的圖表繪制解決方案,所以本文就將使用QChart實現(xiàn)動態(tài)顯示3個設(shè)備的溫度變化曲線,感興趣的可以了解一下

一、介紹

Qt的QChart是一個用于繪制圖表和可視化數(shù)據(jù)的類。提供了一個靈活的、可擴(kuò)展的、跨平臺的圖表繪制解決方案,可以用于各種應(yīng)用程序,如數(shù)據(jù)分析、科學(xué)計算、金融交易等。

QChart支持多種類型的圖表,包括折線圖、散點圖、柱狀圖、餅圖等。它還支持多個數(shù)據(jù)系列(datasets)在同一個圖表中顯示,并且可以自定義各種圖表屬性和樣式,如坐標(biāo)軸標(biāo)簽、標(biāo)題、圖例等。

QChart還支持多種數(shù)據(jù)源(data sources),可以來自Qt的數(shù)據(jù)模型(data models)、CSV文件、JSON文件等。數(shù)據(jù)源可以是任何支持迭代器(iterator)的類型,因此可以輕松地與其他Qt組件集成。

使用QChart可以輕松地創(chuàng)建交互式圖表,如鼠標(biāo)懸停提示(hover tooltip)、數(shù)據(jù)選擇(data selection)等。此外,QChart還支持多種主題(themes)和自定義CSS樣式,使得圖表外觀可以靈活地定制。

二、實現(xiàn)代碼(1)QMainWindow

以下是使用Qt(C++)的QChart模塊顯示3個設(shè)備的動態(tài)溫度曲線的代碼實現(xiàn):

1.實現(xiàn)溫度動態(tài)更新

mainwindow.h

?#ifndef MAINWINDOW_H
?#define MAINWINDOW_H
??
?#include <QMainWindow>
?#include <QtCharts/QChart>
?#include <QtCharts/QLineSeries>
?#include <QTimer>
??
?QT_CHARTS_USE_NAMESPACE
??
?namespace Ui {
?class MainWindow;
?}
??
?class MainWindow : public QMainWindow
?{
? ? ?Q_OBJECT
??
?public:
? ? ?explicit MainWindow(QWidget *parent = nullptr);
? ? ?~MainWindow();
??
?private slots:
? ? ?void updateChartData(); // 更新數(shù)據(jù)槽函數(shù)
??
?private:
? ? ?Ui::MainWindow *ui;
? ? ?QTimer *m_timer; // 定時器
??
? ? ?QChart *m_chart; // 圖表指針
??
? ? ?QLineSeries *m_series1; // 設(shè)備1溫度曲線
? ? ?QLineSeries *m_series2; // 設(shè)備2溫度曲線
? ? ?QLineSeries *m_series3; // 設(shè)備3溫度曲線
??
? ? ?int m_timeCount; // 時間計數(shù)
?};
??
?#endif // MAINWINDOW_H

mainwindow.cpp

?#include "mainwindow.h"
?#include "ui_mainwindow.h"
??
?MainWindow::MainWindow(QWidget *parent) :
? ? ?QMainWindow(parent),
? ? ?ui(new Ui::MainWindow),
? ? ?m_timer(new QTimer(this)),
? ? ?m_chart(new QChart()),
? ? ?m_series1(new QLineSeries()),
? ? ?m_series2(new QLineSeries()),
? ? ?m_series3(new QLineSeries()),
? ? ?m_timeCount(0)
?{
? ? ?ui->setupUi(this);
??
? ? ?// 設(shè)置圖表標(biāo)題
? ? ?m_chart->setTitle("Temperature Data");
??
? ? ?// 創(chuàng)建溫度曲線圖1并設(shè)置屬性
? ? ?m_series1->setName(tr("Device 1"));
? ? ?m_series1->setColor(Qt::red);
? ? ?m_series1->setPen(QPen(Qt::red, 2));
? ? ?m_chart->addSeries(m_series1);
??
? ? ?// 創(chuàng)建溫度曲線圖2并設(shè)置屬性
? ? ?m_series2->setName(tr("Device 2"));
? ? ?m_series2->setColor(Qt::green);
? ? ?m_series2->setPen(QPen(Qt::green, 2));
? ? ?m_chart->addSeries(m_series2);
??
? ? ?// 創(chuàng)建溫度曲線圖3并設(shè)置屬性
? ? ?m_series3->setName(tr("Device 3"));
? ? ?m_series3->setColor(Qt::blue);
? ? ?m_series3->setPen(QPen(Qt::blue, 2));
? ? ?m_chart->addSeries(m_series3);
??
? ? ?// 設(shè)置橫軸屬性
? ? ?QValueAxis *axisX = new QValueAxis;
? ? ?axisX->setRange(0, 30);
? ? ?axisX->setTitleText("Time (s)");
? ? ?m_chart->addAxis(axisX, Qt::AlignBottom);
? ? ?m_series1->attachAxis(axisX);
? ? ?m_series2->attachAxis(axisX);
? ? ?m_series3->attachAxis(axisX);
??
? ? ?// 設(shè)置縱軸屬性
? ? ?QValueAxis *axisY = new QValueAxis;
? ? ?axisY->setRange(0, 60);
? ? ?axisY->setTitleText("Temperature (℃)");
? ? ?m_chart->addAxis(axisY, Qt::AlignLeft);
? ? ?m_series1->attachAxis(axisY);
? ? ?m_series2->attachAxis(axisY);
? ? ?m_series3->attachAxis(axisY);
??
? ? ?// 定時更新數(shù)據(jù)
? ? ?connect(m_timer, &QTimer::timeout, this, &MainWindow::updateChartData);
? ? ?m_timer->start(1000); // 每隔1秒鐘更新一次數(shù)據(jù)
??
? ? ?// 將圖表添加到ChartView中
? ? ?ui->chartView->setChart(m_chart);
? ? ?ui->chartView->setRenderHint(QPainter::Antialiasing);
?}
??
?MainWindow::~MainWindow()
?{
? ? ?delete ui;
?}
??
?void MainWindow::updateChartData()
?{
? ? ?// 更新時間計數(shù)
? ? ?m_timeCount++;
??
? ? ?// 在溫度曲線上增加一個點,模擬溫度數(shù)據(jù)變化
? ? ?QPointF p1(m_timeCount, qrand() % 10 + 20);
? ? ?QPointF p2(m_timeCount, qrand() % 10 + 30);
? ? ?QPointF p3(m_timeCount, qrand() % 10 + 40);
? ? ?m_series1->append(p1);
? ? ?m_series2->append(p2);
? ? ?m_series3->append(p3);
??
? ? ?// 清除多余的點,只保留最新的30個數(shù)據(jù)點
? ? ?if (m_series1->count() > 30) {
? ? ? ? ?m_series1->removePoints(0, 1);
? ?  }
? ? ?if (m_series2->count() > 30) {
? ? ? ? ?m_series2->removePoints(0, 1);
? ?  }
? ? ?if (m_series3->count() > 30) {
? ? ? ? ?m_series3->removePoints(0, 1);
? ?  }
?}

在此代碼中,定義了一個QTimer定時器對象,用于每隔一段時間更新溫度曲線數(shù)據(jù)。在定時器的timeout信號觸發(fā)時,調(diào)用updateChartData()槽函數(shù)來更新溫度曲線數(shù)據(jù),同時控制數(shù)據(jù)量不超過30個點。

在updateChartData()函數(shù)中,使用了qrand()函數(shù)來生成隨機(jī)的溫度數(shù)據(jù),模擬動態(tài)變化的效果。可以根據(jù)實際情況修改此函數(shù)的實現(xiàn)方式。

最后,將圖表添加到QChartView控件中,并啟用抗鋸齒功能以提高顯示質(zhì)量。

2.設(shè)置曲線可見范圍

為了保證曲線顯示一直在可見范圍內(nèi),可以添加如下代碼:

    ?// 使圖表自適應(yīng)大小,確保曲線始終可見
    ?m_chart->createDefaultAxes();
    ?m_chart->axisX()->setRange(0, 30);
    ?m_chart->axisY()->setRange(0, 60);

這段代碼的作用是讓圖表自適應(yīng)大小,并設(shè)置橫軸范圍為0到30,縱軸范圍為0到60。這樣當(dāng)新數(shù)據(jù)點增加到圖表之外時,圖表會自動調(diào)整大小和范圍,以確保曲線始終可見。

完整的mainwindow.cpp代碼如下所示:

    ?#include "mainwindow.h"
    ?#include "ui_mainwindow.h"
    ??
    ?MainWindow::MainWindow(QWidget *parent) :
    ? ? ?QMainWindow(parent),
    ? ? ?ui(new Ui::MainWindow),
    ? ? ?m_timer(new QTimer(this)),
    ? ? ?m_chart(new QChart()),
    ? ? ?m_series1(new QLineSeries()),
    ? ? ?m_series2(new QLineSeries()),
    ? ? ?m_series3(new QLineSeries()),
    ? ? ?m_timeCount(0)
    ?{
    ? ? ?ui->setupUi(this);
    ??
    ? ? ?// 設(shè)置圖表標(biāo)題
    ? ? ?m_chart->setTitle("Temperature Data");
    ??
    ? ? ?// 創(chuàng)建溫度曲線圖1并設(shè)置屬性
    ? ? ?m_series1->setName(tr("Device 1"));
    ? ? ?m_series1->setColor(Qt::red);
    ? ? ?m_series1->setPen(QPen(Qt::red, 2));
    ? ? ?m_chart->addSeries(m_series1);
    ??
    ? ? ?// 創(chuàng)建溫度曲線圖2并設(shè)置屬性
    ? ? ?m_series2->setName(tr("Device 2"));
    ? ? ?m_series2->setColor(Qt::green);
    ? ? ?m_series2->setPen(QPen(Qt::green, 2));
    ? ? ?m_chart->addSeries(m_series2);
    ??
    ? ? ?// 創(chuàng)建溫度曲線圖3并設(shè)置屬性
    ? ? ?m_series3->setName(tr("Device 3"));
    ? ? ?m_series3->setColor(Qt::blue);
    ? ? ?m_series3->setPen(QPen(Qt::blue, 2));
    ? ? ?m_chart->addSeries(m_series3);
    ??
    ? ? ?// 設(shè)置橫軸屬性
    ? ? ?QValueAxis *axisX = new QValueAxis;
    ? ? ?axisX->setRange(0, 30);
    ? ? ?axisX->setTitleText("Time (s)");
    ? ? ?m_chart->addAxis(axisX, Qt::AlignBottom);
    ? ? ?m_series1->attachAxis(axisX);
    ? ? ?m_series2->attachAxis(axisX);
    ? ? ?m_series3->attachAxis(axisX);
    ??
    ? ? ?// 設(shè)置縱軸屬性
    ? ? ?QValueAxis *axisY = new QValueAxis;
    ? ? ?axisY->setRange(0, 60);
    ? ? ?axisY->setTitleText("Temperature (℃)");
    ? ? ?m_chart->addAxis(axisY, Qt::AlignLeft);
    ? ? ?m_series1->attachAxis(axisY);
    ? ? ?m_series2->attachAxis(axisY);
    ? ? ?m_series3->attachAxis(axisY);
    ??
    ? ? ?// 使圖表自適應(yīng)大小,確保曲線始終可見
    ? ? ?m_chart->createDefaultAxes();
    ? ? ?m_chart->axisX()->setRange(0, 30);
    ? ? ?m_chart->axisY()->setRange(0, 60);
    ??
    ? ? ?// 定時更新數(shù)據(jù)
    ? ? ?connect(m_timer, &QTimer::timeout, this, &MainWindow::updateChartData);
    ? ? ?m_timer->start(1000); // 每隔1秒鐘更新一次數(shù)據(jù)
    ??
    ? ? ?// 將圖表添加到ChartView中
    ? ? ?ui->chartView->setChart(m_chart);
    ? ? ?ui->chartView->setRenderHint(QPainter::Antialiasing);
    ?}
    ??
    ?MainWindow::~MainWindow()
    ?{
    ? ? ?delete ui;
    ?}
    ??
    ?void MainWindow::updateChartData()
    ?{
    ? ? ?// 更新時間計數(shù)
    ? ? ?m_timeCount++;
    ??
    ? ? ?// 在溫度曲線上增加一個點,模擬溫度數(shù)據(jù)變化
    ? ? ?QPointF p1(m_timeCount, qrand() % 10 + 20);
    ? ? ?QPointF p2(m_timeCount, qrand() % 10 + 30);
    ? ? ?QPointF p3(m_timeCount, qrand() % 10 + 40);
    ? ? ?m_series1->append(p1);
    ? ? ?m_series2->append(p2);
    ? ? ?m_series3->append(p3);
    ??
    ? ? ?// 清除多余的點,只保留最新的30個數(shù)據(jù)點
    ? ? ?if (m_series1->count() > 30) {
    ? ? ? ? ?m_series1->removePoints(0, 1);
    ? ?  }
    ? ? ?if (m_series2->count() > 30) {
    ? ? ? ? ?m_series2->removePoints(0, 1);
    ? ?  }
    ? ? ?if (m_series3->count() > 30) {
    ? ? ? ? ?m_series3->removePoints(0, 1);
    ? ?  }
    ?}

3.實現(xiàn)鼠標(biāo)交互拖動

要實現(xiàn)折線圖的橫坐標(biāo)可以拖動,可以設(shè)置QChartView的交互模式為拖拽,在構(gòu)造函數(shù)中添加如下代碼:

    ?// 設(shè)置 ChartView 交互模式為拖拽
    ?ui->chartView->setRubberBand(QChartView::HorizontalRubberBand);
    ?ui->chartView->setRenderHint(QPainter::Antialiasing);
    ?ui->chartView->setDragMode(QGraphicsView::ScrollHandDrag);

這樣用戶就可以通過鼠標(biāo)左鍵在橫軸上拖拽來改變曲線圖的可見范圍。同時,還需要在mainwindow.cpp中添加橫坐標(biāo)的范圍更新函數(shù)updateAxisRange(),用于在拖拽時更新橫坐標(biāo)的范圍。

完整的mainwindow.cpp代碼如下所示:

    ?#include "mainwindow.h"
    ?#include "ui_mainwindow.h"
    ??
    ?MainWindow::MainWindow(QWidget *parent) :
    ? ? ?QMainWindow(parent),
    ? ? ?ui(new Ui::MainWindow),
    ? ? ?m_timer(new QTimer(this)),
    ? ? ?m_chart(new QChart()),
    ? ? ?m_series1(new QLineSeries()),
    ? ? ?m_series2(new QLineSeries()),
    ? ? ?m_series3(new QLineSeries()),
    ? ? ?m_timeCount(0)
    ?{
    ? ? ?ui->setupUi(this);
    ??
    ? ? ?// 設(shè)置圖表標(biāo)題
    ? ? ?m_chart->setTitle("Temperature Data");
    ??
    ? ? ?// 創(chuàng)建溫度曲線圖1并設(shè)置屬性
    ? ? ?m_series1->setName(tr("Device 1"));
    ? ? ?m_series1->setColor(Qt::red);
    ? ? ?m_series1->setPen(QPen(Qt::red, 2));
    ? ? ?m_chart->addSeries(m_series1);
    ??
    ? ? ?// 創(chuàng)建溫度曲線圖2并設(shè)置屬性
    ? ? ?m_series2->setName(tr("Device 2"));
    ? ? ?m_series2->setColor(Qt::green);
    ? ? ?m_series2->setPen(QPen(Qt::green, 2));
    ? ? ?m_chart->addSeries(m_series2);
    ??
    ? ? ?// 創(chuàng)建溫度曲線圖3并設(shè)置屬性
    ? ? ?m_series3->setName(tr("Device 3"));
    ? ? ?m_series3->setColor(Qt::blue);
    ? ? ?m_series3->setPen(QPen(Qt::blue, 2));
    ? ? ?m_chart->addSeries(m_series3);
    ??
    ? ? ?// 設(shè)置橫軸屬性
    ? ? ?QValueAxis *axisX = new QValueAxis;
    ? ? ?axisX->setRange(0, 30);
    ? ? ?axisX->setTitleText("Time (s)");
    ? ? ?m_chart->addAxis(axisX, Qt::AlignBottom);
    ? ? ?m_series1->attachAxis(axisX);
    ? ? ?m_series2->attachAxis(axisX);
    ? ? ?m_series3->attachAxis(axisX);
    ??
    ? ? ?// 設(shè)置縱軸屬性
    ? ? ?QValueAxis *axisY = new QValueAxis;
    ? ? ?axisY->setRange(0, 60);
    ? ? ?axisY->setTitleText("Temperature (℃)");
    ? ? ?m_chart->addAxis(axisY, Qt::AlignLeft);
    ? ? ?m_series1->attachAxis(axisY);
    ? ? ?m_series2->attachAxis(axisY);
    ? ? ?m_series3->attachAxis(axisY);
    ??
    ? ? ?// 使圖表自適應(yīng)大小,確保曲線始終可見
    ? ? ?m_chart->createDefaultAxes();
    ? ? ?m_chart->axisX()->setRange(0, 30);
    ? ? ?m_chart->axisY()->setRange(0, 60);
    ??
    ? ? ?// 設(shè)置 ChartView 交互模式為拖拽
    ? ? ?ui->chartView->setRubberBand(QChartView::HorizontalRubberBand);
    ? ? ?ui->chartView->setRenderHint(QPainter::Antialiasing);
    ? ? ?ui->chartView->setDragMode(QGraphicsView::ScrollHandDrag);
    ??
    ? ? ?// 定時更新數(shù)據(jù)
    ? ? ?connect(m_timer, &QTimer::timeout, this, &MainWindow::updateChartData);
    ? ? ?m_timer->start(1000); // 每隔1秒鐘更新一次數(shù)據(jù)
    ??
    ? ? ?// 將圖表添加到ChartView中
    ? ? ?ui->chartView->setChart(m_chart);
    ?}
    ??
    ?MainWindow::~MainWindow()
    ?{
    ? ? ?delete ui;
    ?}
    ??
    ?void MainWindow::updateChartData()
    ?{
    ? ? ?// 更新時間計數(shù)
    ? ? ?m_timeCount++;
    ??
    ? ? ?// 在溫度曲線上增加一個點,模擬溫度數(shù)據(jù)變化
    ? ? ?QPointF p1(m_timeCount, qrand() % 10 + 20);
    ? ? ?QPointF p2(m_timeCount, qrand() % 10 + 30);
    ? ? ?QPointF p3(m_timeCount, qrand() % 10 + 40);
    ? ? ?m_series1->append(p1);
    ? ? ?m_series2->append(p2);
    ? ? ?m_series3->append(p3);
    ??
    ? ? ?// 清除多余的點,只保留最新的30個數(shù)據(jù)點
    ? ? ?if (m_series1->count() > 30) {
    ? ? ? ? ?m_series1->removePoints(0, 1);
    ? ?  }
    ? ? ?if (m_series2->count() > 30) {
    ? ? ? ? ?m_series2->removePoints(0, 1);
    ? ?  }
    ? ? ?if (m_series3->count() > 30) {
    ? ? ? ? ?m_series3->removePoints(0, 1);
    ? ?  }
    ??
    ? ? ?// 更新橫軸范圍
    ? ? ?updateAxisRange();
    ?}
    ??
    ?void MainWindow::updateAxisRange()
    ?{
    ? ? ?// 獲取橫軸范圍
    ? ? ?qreal minX = std::numeric_limits<qreal>::max();
    ? ? ?qreal maxX = std::numeric_limits<qreal>::min();
    ? ? ?foreach (QAbstractSeries *series, m_chart->series()) {
    ? ? ? ? ?QXYSeries *xySeries = static_cast<QXYSeries*>(series);
    ? ? ? ? ?QPointF p1 = xySeries->at(0);
    ? ? ? ? ?QPointF p2 = xySeries->at(xySeries->count() - 1);
    ??
    ? ? ? ? ?if (p1.x() < minX) {
    ? ? ? ? ? ? ?minX = p1.x();
    ? ? ? ?  }
    ? ? ? ? ?if (p2.x() > maxX) {
    ? ? ? ? ? ? ?maxX = p2.x();
    ? ? ? ?  }
    ? ?  }
    ??
    ? ? ?// 更新橫軸范圍
    ? ? ?m_chart->axisX()->setRange(minX, maxX);
    ?}

為了更新橫坐標(biāo)的范圍,需要在MainWindow中添加了一個新函數(shù)updateAxisRange()。該函數(shù)會在數(shù)據(jù)更新時被調(diào)用來計算最新的橫軸范圍,以更新折線圖的顯示。

三、實現(xiàn)代碼(2)QWidget

當(dāng)前這份完整代碼實現(xiàn)了一個動態(tài)折線圖的繪制,是一個典型的Qt Charts應(yīng)用程序。通過使用QLineSeries類、QValueAxis類和QChart類來創(chuàng)建并顯示溫度隨時間變化的折線圖。

第一步:先創(chuàng)建了主窗口,其中包含一個QChartView控件,用于顯示溫度曲線圖。在構(gòu)造函數(shù)中,設(shè)置了一些基本屬性,比如標(biāo)題、橫縱坐標(biāo)的范圍和名稱等,并為每個設(shè)備創(chuàng)建了一個QLineSeries對象,用于存儲溫度數(shù)據(jù)。

第二步:將這些QLineSeries對象添加到QChart對象中。接著,將QValueAxis對象添加到QChart中,設(shè)置其范圍和名稱,并將QLineSeries對象與其關(guān)聯(lián)。最后,將QChart對象添加到QChartView中,以便在界面上顯示折線圖。

第三步:在updateChartData()函數(shù)中,定時器每隔1秒鐘觸發(fā)一次,用于更新溫度數(shù)據(jù),并通過調(diào)用QLineSeries類的append()函數(shù)向QLineSeries對象中添加新的溫度數(shù)據(jù)點。同時,使用removePoints()函數(shù)刪除舊的數(shù)據(jù)點,以保持折線圖中顯示的數(shù)據(jù)點不超過30個。在添加或刪除數(shù)據(jù)時,使用updateAxisRange()函數(shù)更新橫坐標(biāo)的范圍,以便將折線圖自適應(yīng)地縮放到當(dāng)前數(shù)據(jù)范圍內(nèi)。

第四步:重載了updateAxisRange()函數(shù),根據(jù)QLineSeries對象的數(shù)據(jù)點計算出橫坐標(biāo)的最小值和最大值,并通過調(diào)用QChart類的axisX()->setRange()函數(shù)更新QValueAxis對象的范圍。

1.widget.cpp代碼

    ?#include "widget.h"
    ?#include "ui_widget.h"
    ??
    ?Widget::Widget(QWidget *parent)
    ? ?  : QWidget(parent)
    ? ?  , ui(new Ui::Widget)
    ?{
    ? ? ?ui->setupUi(this);
    ??
    ? ? ?this->setWindowTitle("溫度數(shù)據(jù)可視化采集系統(tǒng)");
    ??
    ? ? ?m_timer=new QTimer(this);
    ? ? ?m_chart=new QChart();
    ??
    ? ? ?m_series1=new QLineSeries();
    ? ? ?m_series2=new QLineSeries();
    ? ? ?m_series3=new QLineSeries();
    ??
    ? ? ?m_timeCount=0;
    ??
    ? ? ?// 創(chuàng)建溫度曲線圖1并設(shè)置屬性
    ? ? ?m_series1->setName(tr("設(shè)備1"));
    ?// ?  m_series1->setColor(Qt::red);
    ?// ?  m_series1->setPen(QPen(Qt::red, 2));
    ? ? ?m_chart->addSeries(m_series1);
    ??
    ? ? ?// 創(chuàng)建溫度曲線圖2并設(shè)置屬性
    ? ? ?m_series2->setName(tr("設(shè)備2"));
    ?// ?  m_series2->setColor(Qt::green);
    ?// ?  m_series2->setPen(QPen(Qt::green, 2));
    ? ? ?m_chart->addSeries(m_series2);
    ??
    ? ? ?// 創(chuàng)建溫度曲線圖3并設(shè)置屬性
    ? ? ?m_series3->setName(tr("設(shè)備3"));
    ?// ?  m_series3->setColor(Qt::blue);
    ?// ?  m_series3->setPen(QPen(Qt::blue, 2));
    ? ? ?m_chart->addSeries(m_series3);
    ??
    ? ? ?// 設(shè)置橫軸屬性
    ? ? ?QValueAxis *axisX = new QValueAxis;
    ? ? ?axisX->setRange(0, 30);
    ? ? ?axisX->setTitleText("時間 (s)");
    ? ? ?m_chart->addAxis(axisX, Qt::AlignBottom);
    ? ? ?m_series1->attachAxis(axisX);
    ? ? ?m_series2->attachAxis(axisX);
    ? ? ?m_series3->attachAxis(axisX);
    ??
    ? ? ?// 設(shè)置縱軸屬性
    ? ? ?QValueAxis *axisY = new QValueAxis;
    ? ? ?axisY->setRange(0, 60);
    ? ? ?axisY->setTitleText("溫度 (℃)");
    ? ? ?m_chart->addAxis(axisY, Qt::AlignLeft);
    ? ? ?m_series1->attachAxis(axisY);
    ? ? ?m_series2->attachAxis(axisY);
    ? ? ?m_series3->attachAxis(axisY);
    ??
    ? ? ?// 使圖表自適應(yīng)大小,確保曲線始終可見
    ? ? ? ?m_chart->createDefaultAxes();
    ? ? ? ?m_chart->axisX()->setRange(0, 30);
    ? ? ? ?m_chart->axisY()->setRange(0, 60);
    ??
    ??
    ? ? ?// 定時更新數(shù)據(jù)
    ? ? ?connect(m_timer, &QTimer::timeout, this, &Widget::updateChartData);
    ??
    ? ? ?// 將圖表添加到ChartView中
    ? ? ?QChartView* chartView = new QChartView(m_chart);
    ??
    ? ? ?// 設(shè)置 ChartView 交互模式為拖拽
    ? ? ?chartView->setRubberBand(QChartView::HorizontalRubberBand);
    ? ? ?chartView->setRenderHint(QPainter::Antialiasing);
    ? ? ?chartView->setDragMode(QGraphicsView::ScrollHandDrag);
    ??
    ? ? ?chartView->setRenderHint(QPainter::Antialiasing);
    ??
    ? ? ?//將視圖添加到布局
    ? ? ?ui->view_verticalLayout->addWidget(chartView);
    ?}
    ??
    ??
    ??
    ?Widget::~Widget()
    ?{
    ? ? ?delete ui;
    ?}
    ??
    ??
    ?void Widget::updateChartData()
    ?{
    ? ? ?// 更新時間計數(shù)
    ? ? ?m_timeCount++;
    ??
    ? ? ?// 在溫度曲線上增加一個點,模擬溫度數(shù)據(jù)變化
    ? ? ?QPointF p1(m_timeCount, qrand() % 10 + 20);
    ? ? ?QPointF p2(m_timeCount, qrand() % 10 + 30);
    ? ? ?QPointF p3(m_timeCount, qrand() % 10 + 40);
    ? ? ?m_series1->append(p1);
    ? ? ?m_series2->append(p2);
    ? ? ?m_series3->append(p3);
    ??
    ? ? ?// 清除多余的點,只保留最新的30個數(shù)據(jù)點
    ? ? ?if (m_series1->count() > 30) {
    ? ? ? ? ?m_series1->removePoints(0, 1);
    ? ?  }
    ? ? ?if (m_series2->count() > 30) {
    ? ? ? ? ?m_series2->removePoints(0, 1);
    ? ?  }
    ? ? ?if (m_series3->count() > 30) {
    ? ? ? ? ?m_series3->removePoints(0, 1);
    ? ?  }
    ??
    ? ? ?// 更新橫軸范圍
    ? ? ?updateAxisRange();
    ?}
    ??
    ??
    ?void Widget::updateAxisRange()
    ?{
    ? ? ?// 獲取橫軸范圍
    ? ? ?qreal minX = std::numeric_limits<qreal>::max();
    ? ? ?qreal maxX = std::numeric_limits<qreal>::min();
    ? ? ?foreach (QAbstractSeries *series, m_chart->series()) {
    ? ? ? ? ?QXYSeries *xySeries = static_cast<QXYSeries*>(series);
    ? ? ? ? ?QPointF p1 = xySeries->at(0);
    ? ? ? ? ?QPointF p2 = xySeries->at(xySeries->count() - 1);
    ??
    ? ? ? ? ?if (p1.x() < minX) {
    ? ? ? ? ? ? ?minX = p1.x();
    ? ? ? ?  }
    ? ? ? ? ?if (p2.x() > maxX) {
    ? ? ? ? ? ? ?maxX = p2.x();
    ? ? ? ?  }
    ? ?  }
    ??
    ? ? ?// 更新橫軸范圍
    ? ? ?m_chart->axisX()->setRange(minX, maxX);
    ?}
    ??
    ??
    ??
    ?//開始采集
    ?void Widget::on_pushButton_start_clicked()
    ?{
    ? ? ?m_timer->start(1000); // 每隔1秒鐘更新一次數(shù)據(jù)
    ?}
    ??
    ??
    ?//停止采集
    ?void Widget::on_pushButton_stop_clicked()
    ?{
    ? ? ?m_timer->stop(); //停止定時器
    ?}

2.widget.h代碼

    ?#ifndef WIDGET_H
    ?#define WIDGET_H
    ??
    ?#include <QWidget>
    ??
    ?// 包含line chart需要的頭文件
    ?#include <QtCharts/QChart>
    ?#include <QtCharts/QLineSeries>
    ?#include <QtCharts/QChartView>
    ?#include <QtCore/QRandomGenerator>
    ?#include <QValueAxis>
    ?#include <QScatterSeries>
    ?#include <QTimer>
    ??
    ?// 引用命名空間
    ?QT_CHARTS_USE_NAMESPACE
    ??
    ?QT_BEGIN_NAMESPACE
    ?namespace Ui { class Widget; }
    ?QT_END_NAMESPACE
    ??
    ?class Widget : public QWidget
    ?{
    ? ? ?Q_OBJECT
    ??
    ?public:
    ? ? ?Widget(QWidget *parent = nullptr);
    ? ? ?~Widget();
    ?private slots:
    ? ? ?void updateChartData(); // 更新數(shù)據(jù)槽函數(shù)
    ? ? ?void updateAxisRange();
    ??
    ? ? ?void on_pushButton_start_clicked();
    ??
    ? ? ?void on_pushButton_stop_clicked();
    ??
    ?private:
    ? ? ?Ui::Widget *ui;
    ??
    ? ? ?QTimer *m_timer; // 定時器
    ??
    ? ? ?QChart *m_chart; // 圖表指針
    ??
    ? ? ?QLineSeries *m_series1; // 設(shè)備1溫度曲線
    ? ? ?QLineSeries *m_series2; // 設(shè)備2溫度曲線
    ? ? ?QLineSeries *m_series3; // 設(shè)備3溫度曲線
    ??
    ? ? ?int m_timeCount; // 時間計數(shù)
    ?};
    ?#endif // WIDGET_H

3.UI文件代碼

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>Widget</class>
     <widget class="QWidget" name="Widget">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>600</width>
        <height>444</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>Widget</string>
      </property>
      <layout class="QVBoxLayout" name="verticalLayout">
       <item>
        <widget class="QWidget" name="widget" native="true">
         <property name="minimumSize">
          <size>
           <width>100</width>
           <height>100</height>
          </size>
         </property>
         <layout class="QVBoxLayout" name="verticalLayout_2">
          <property name="spacing">
           <number>0</number>
          </property>
          <property name="leftMargin">
           <number>0</number>
          </property>
          <property name="topMargin">
           <number>0</number>
          </property>
          <property name="rightMargin">
           <number>0</number>
          </property>
          <property name="bottomMargin">
           <number>0</number>
          </property>
          <item>
           <layout class="QVBoxLayout" name="view_verticalLayout"/>
          </item>
         </layout>
        </widget>
       </item>
       <item>
        <widget class="QWidget" name="widget_2" native="true">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>40</height>
          </size>
         </property>
         <layout class="QHBoxLayout" name="horizontalLayout">
          <property name="spacing">
           <number>0</number>
          </property>
          <property name="leftMargin">
           <number>0</number>
          </property>
          <property name="topMargin">
           <number>0</number>
          </property>
          <property name="rightMargin">
           <number>0</number>
          </property>
          <property name="bottomMargin">
           <number>0</number>
          </property>
          <item>
           <widget class="QPushButton" name="pushButton_start">
            <property name="text">
             <string>開始采集</string>
            </property>
           </widget>
          </item>
          <item>
           <widget class="QPushButton" name="pushButton_stop">
            <property name="text">
             <string>停止采集</string>
            </property>
           </widget>
          </item>
         </layout>
        </widget>
       </item>
      </layout>
     </widget>
     <resources/>
     <connections/>
    </ui>

4.pro工程文件

    QT       += core gui
    QT       += 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 \
        widget.cpp
    HEADERS += \
        widget.h
    FORMS += \
        widget.ui
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target

以上就是Qt使用QChart實現(xiàn)動態(tài)顯示溫度變化曲線的詳細(xì)內(nèi)容,更多關(guān)于Qt QChart的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言程序打豆豆(函數(shù)版)

    C語言程序打豆豆(函數(shù)版)

    今天小編就為大家分享一篇關(guān)于C語言程序打豆豆(函數(shù)版),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C語言小游戲之簡易版三子棋(棋盤可自由擴(kuò)展)

    C語言小游戲之簡易版三子棋(棋盤可自由擴(kuò)展)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)三子棋游戲,還可以自由擴(kuò)展棋盤大小,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 一文帶你了解C語言中static關(guān)鍵字的3個作用

    一文帶你了解C語言中static關(guān)鍵字的3個作用

    static這個關(guān)鍵字是“靜態(tài)”的意思,在C語言里主要有3個作用。這篇文章主要通過一些簡單示例為大家詳細(xì)講講這3個左右,感興趣的小伙伴可以了解一下
    2023-04-04
  • C++調(diào)用C#的DLL實現(xiàn)方法

    C++調(diào)用C#的DLL實現(xiàn)方法

    這篇文章主要介紹了C++調(diào)用C#的DLL實現(xiàn)方法,很有實用價值,需要的朋友可以參考下
    2014-07-07
  • C語言實現(xiàn)自動售貨機(jī)

    C語言實現(xiàn)自動售貨機(jī)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)自動售貨機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 使用C++繪制GDI位圖的基本編寫實例

    使用C++繪制GDI位圖的基本編寫實例

    這篇文章主要介紹了使用C++繪制GDI位圖的基本編寫實例,一般來說適用于Windwos下的C++的GUI編程,需要的朋友可以參考下
    2015-12-12
  • C語言代碼實現(xiàn)點餐系統(tǒng)

    C語言代碼實現(xiàn)點餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)點餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言實現(xiàn)代碼雨效果

    C語言實現(xiàn)代碼雨效果

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)代碼雨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 深入淺析C++的new和delete

    深入淺析C++的new和delete

    new和delete既是C++中的關(guān)鍵字也是一種特殊的運算符。這篇文章主要介紹了C++的new和delete詳解,需要的朋友可以參考下
    2018-02-02
  • C語言簡易通訊錄的實現(xiàn)代碼

    C語言簡易通訊錄的實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C語言簡易通訊錄的實現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論