Qt使用QChart实现静态显示温度变化曲线

 更新时间:2023年06月02日 14:45:42   作者:DS小龙哥  
QChart模块是Qt Charts库的基础,提供了用于创建和显示各种类型图表的类和接口,本文主要介绍了如何使用QChart实现动态显示3个设备的温度变化曲线,感兴趣的可以了解一下

一、QChart介绍

QChart模块是Qt Charts库的基础,提供了用于创建和显示各种类型图表的类和接口。Qt Charts库是一个功能丰富、易于使用的数据可视化工具库,可以帮助开发者在应用程序中添加漂亮而又交互性强的图表。

QChart模块主要包括以下类:

  • QChart:表示一个基本的图表容器,它可以包含一个或多个QAbstractSeries对象。开发者可以设置图表的标题、动画效果、背景、边框以及坐标轴等属性,并添加或移除序列数据。
  • QAbstractSeries:表示一个序列数据,它是QLineSeries、QScatterSeries等具体序列类型的基类,开发者可以通过继承该类来创建自定义序列类型。
  • QLineSeries:表示一条折线序列,它可以用于绘制单一或多条折线曲线图。
  • QScatterSeries:表示一个散点图序列,它可以用于绘制数据点之间的离散分布情况。
  • QBarSeries:表示一个条形图序列,它可以用于展示分类数据在不同类别中的分布情况。
  • QPercentBarSeries:表示一个百分比条形图序列,它可以用于展示分类数据在不同类别中的占比情况。
  • QPieSeries:表示一个饼图序列,它可以用于展示不同数据之间的占比关系。
  • QChartView:表示QChart对象的视图类,开发者可以将QChart对象设置为QChartView的子对象,并添加到窗口中以便显示。

通过使用QChart模块,开发者可以轻松地创建并自定义各种类型的图表,例如折线曲线图、散点图、条形图、饼图等,并以交互性强的方式来展示数据,为应用程序增加了更多的可视化效果。

下面是通过折线图显示3个设备的温度变化趋势效果:

二、实现代码(1)

以下是使用QChart显示3个折线图,表示3个设备的温度曲线的实现代码: (温度数据是模拟的数据)

 #include <QtWidgets/QMainWindow>
 #include <QtCharts/QChart>
 #include <QtCharts/QLineSeries>
 #include <QtCharts/QChartView>
 #include <QtCore/QRandomGenerator>
 #include <QtCore/QDebug>
 #include <QtGui/QWindow>
 ​
 QT_CHARTS_USE_NAMESPACE
 ​
 class MainWindow : public QMainWindow
 {
     Q_OBJECT
 ​
 public:
     MainWindow(QWidget *parent = nullptr)
         : QMainWindow(parent)
     {
         // 数据初始化
         for (int i = 0; i < 30; i++) {
             m_data[0].append(QPointF(i, QRandomGenerator::global()->bounded(10, 30)));
             m_data[1].append(QPointF(i, QRandomGenerator::global()->bounded(20, 40)));
             m_data[2].append(QPointF(i, QRandomGenerator::global()->bounded(30, 50)));
         }
 ​
         // 创建线性图对象
         QChart* chart = new QChart();
         chart->setTitle("Temperature Data");
         chart->setAnimationOptions(QChart::SeriesAnimations);
 ​
         // 创建线序列对象
         QLineSeries* series1 = new QLineSeries(chart);
         QLineSeries* series2 = new QLineSeries(chart);
         QLineSeries* series3 = new QLineSeries(chart);
 ​
         // 设置线颜色、名字和宽度
         series1->setColor(Qt::red);
         series1->setName("Device1");
         series1->setPen(QPen(Qt::red, 2));
 ​
         series2->setColor(Qt::green);
         series2->setName("Device2");
         series2->setPen(QPen(Qt::green, 2));
 ​
         series3->setColor(Qt::blue);
         series3->setName("Device3");
         series3->setPen(QPen(Qt::blue, 2));
 ​
         // 添加数据到线序列对象
         for (const QPointF& point : m_data[0]) {
             *series1 << point;
         }
         for (const QPointF& point : m_data[1]) {
             *series2 << point;
         }
         for (const QPointF& point : m_data[2]) {
             *series3 << point;
         }
 ​
         // 添加线序列对象到图表
         chart->addSeries(series1);
         chart->addSeries(series2);
         chart->addSeries(series3);
 ​
         // 设置横轴和纵轴标签
         QValueAxis* axisX = new QValueAxis();
         axisX->setTitleText("Time (s)");
         axisX->setRange(0, 29);
 ​
         QValueAxis* axisY = new QValueAxis();
         axisY->setTitleText("Temperature (℃)");
         axisY->setRange(0, 60);
 ​
         // 添加横轴和纵轴到图表
         chart->setAxisX(axisX);
         chart->setAxisY(axisY);
 ​
         // 创建图表视图
         QChartView* chartView = new QChartView(chart);
         chartView->setRenderHint(QPainter::Antialiasing);
         setCentralWidget(chartView);
     }
 ​
 private:
     // 存储温度数据的二维数组
     QVector<QPointF> m_data[3];
 };
 ​
 int main(int argc, char *argv[])
 {
     QApplication a(argc, argv);
     MainWindow w;
     w.show();
     return a.exec();
 }

以上是一个完整的Qt窗口程序,可以直接运行并显示3个设备的温度曲线。

在程序中,使用QChart对象作为图表容器,创建了3个QLineSeries对象用于展示3个设备的温度数据,并将它们添加到QChart对象中。自定义了横轴和纵轴标签及范围,并将它们添加到QChart对象中。最后,创建了一个QChartView对象,并将QChart对象设置为其子对象,以展示整个温度曲线图表。

三、实现代码(2)

如果自己需要设计UI界面,添加QChart显示折线图。下面演示一下过程。

1.添加模块

2.设计UI

3.设计代码-头文件

 #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>
 ​
 // 引用命名空间
 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:
     Ui::Widget *ui;
 ​
      QChart *chart;
      QChartView *chartView;
 };
 #endif // WIDGET_H

4.设计代码-源文件

 #include "widget.h"
 #include "ui_widget.h"
 ​
 Widget::Widget(QWidget *parent)
     : QWidget(parent)
     , ui(new Ui::Widget)
 {
     ui->setupUi(this);
 ​
     // 存储温度数据的二维数组
     QVector<QPointF> m_data[3];
 ​
     // 数据初始化
     for (int i = 0; i < 30; i++) {
         m_data[0].append(QPointF(i, QRandomGenerator::global()->bounded(10, 30)));
         m_data[1].append(QPointF(i, QRandomGenerator::global()->bounded(20, 40)));
         m_data[2].append(QPointF(i, QRandomGenerator::global()->bounded(30, 50)));
     }
 ​
     // 创建线性图对象
     QChart* chart = new QChart();
     chart->setTitle("Temperature Data");
     chart->setAnimationOptions(QChart::SeriesAnimations);
 ​
     // 创建线序列对象
     QLineSeries* series1 = new QLineSeries(chart);
     QLineSeries* series2 = new QLineSeries(chart);
     QLineSeries* series3 = new QLineSeries(chart);
 ​
     // 设置线颜色、名字和宽度
 //    series1->setColor(Qt::red);
     series1->setName("Device1");
 //    series1->setPen(QPen(Qt::red, 2));
 ​
 //    series2->setColor(Qt::green);
     series2->setName("Device2");
 //    series2->setPen(QPen(Qt::green, 2));
 ​
 //    series3->setColor(Qt::blue);
     series3->setName("Device3");
 //    series3->setPen(QPen(Qt::blue, 2));
 ​
 ​
     // 添加数据到线序列对象
     for (const QPointF& point : m_data[0]) {
         *series1 << point;
     }
     for (const QPointF& point : m_data[1]) {
         *series2 << point;
     }
     for (const QPointF& point : m_data[2]) {
         *series3 << point;
     }
 ​
     // 添加线序列对象到图表
     chart->addSeries(series1);
     chart->addSeries(series2);
     chart->addSeries(series3);
 ​
     // 设置横轴和纵轴标签
     QValueAxis* axisX = new QValueAxis();
     axisX->setTitleText("Time (s)");
     axisX->setRange(0, 29);
 ​
     QValueAxis* axisY = new QValueAxis();
     axisY->setTitleText("Temperature (℃)");
     axisY->setRange(0, 60);
 ​
     // 添加横轴和纵轴到图表
     chart->setAxisX(axisX);
     chart->setAxisY(axisY);
 ​
     // 创建图表视图
     QChartView* chartView = new QChartView(chart);
     chartView->setRenderHint(QPainter::Antialiasing);
 ​
 ​
     //将视图添加到布局
     ui->view_verticalLayout->addWidget(chartView);
 }
 ​
 ​
 ​
 Widget::~Widget()
 {
     delete ui;
 }

到此这篇关于Qt使用QChart实现静态显示温度变化曲线的文章就介绍到这了,更多相关Qt QChart内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言操作XML文件的技术和方法

    C语言操作XML文件的技术和方法

    XML因其灵活性和标准化特性,被广泛应用于数据交换、配置文件、Web服务等领域,C语言作为一种高效、底层的编程语言,在处理XML数据方面也有广泛的应用,本文将深入探讨C语言操作XML的技术和方法,需要的朋友可以参考下
    2025-03-03
  • C++小知识:不要去做编译器的工作

    C++小知识:不要去做编译器的工作

    今天小编就为大家分享一篇关于C++小知识:不要去做编译器的工作,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • C++实现结束应用进程小工具

    C++实现结束应用进程小工具

    这篇文章主要为大家详细介绍了C++实现结束应用进程小工具,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C语言实现二叉树链式结构的示例详解

    C语言实现二叉树链式结构的示例详解

    这篇文章主要为大家详细介绍了C语言实现二叉树链式结构的相关资料,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,需要的可以参考一下
    2022-11-11
  • C++贪心算法实现活动安排问题(实例代码)

    C++贪心算法实现活动安排问题(实例代码)

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。这篇文章主要介绍了C++贪心算法实现活动安排问题,需要的朋友可以参考下
    2019-11-11
  • C++实现MyString的示例代码

    C++实现MyString的示例代码

    本文主要介绍了C++实现MyString的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++ 实现自定义类型的迭代器操作

    C++ 实现自定义类型的迭代器操作

    这篇文章主要介绍了C++ 实现自定义类型的迭代器操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Qt实现简单动态时钟

    Qt实现简单动态时钟

    这篇文章主要为大家详细介绍了Qt实现简单动态时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C++核心编程之内存分区模型详解

    C++核心编程之内存分区模型详解

    这篇文章主要为大家介绍了C++核心编程中内存分区模型,C++程序在执行时,将内存大方向分为四个区域,代码区,全局区,栈区,堆区,文章通过代码示例介绍的非常详细,感兴趣的同学可以参考阅读下
    2023-07-07
  • C语言中的sscanf()函数使用

    C语言中的sscanf()函数使用

    本文主要介绍了C语言中的sscanf()函数使用,sscanf通常被用来解析并转换字符串,可以实现很强大的字符串解析功能,下面就一起来了解一下
    2023-05-05

最新评论