Qt(C++)使用QChart静态显示3个设备的温度变化曲线

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

一、QChart介绍

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

QChart模块主要包括以下类:

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

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

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

image-20230529133220218

image-20230529132333629

二、实现代码(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】添加模块

image-20230529133646300

【2】设计UI

image-20230529133814592

【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

【3】设计代码-源文件

#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;
}
目录
相关文章
|
2月前
|
安全 网络协议 数据安全/隐私保护
掌握Qt和C++:构建你的第一个P2P应用程序
掌握Qt和C++:构建你的第一个P2P应用程序
152 3
|
2月前
|
编译器 API C语言
深入探究Qt与C++标准的兼容之旅
深入探究Qt与C++标准的兼容之旅
220 3
|
2月前
|
编译器 API 数据安全/隐私保护
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
173 3
|
1天前
|
存储 JSON 数据可视化
Qt(C++)使用QChart动态显示3个设备的温度变化曲线
Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。
11 1
|
27天前
|
数据处理 开发工具 C++
Qt C++ 扫码枪使用数据处理
Qt C++ 扫码枪使用数据处理
|
2月前
|
开发框架 Linux C++
Qt:强大的跨平台C++应用程序开发框架
Qt:强大的跨平台C++应用程序开发框架
82 3
|
2月前
|
开发框架 编译器 C++
Qt:一个强大的跨平台C++应用程序开发框架
Qt:一个强大的跨平台C++应用程序开发框架
63 1
|
2月前
|
算法 编译器 Linux
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
52 0
|
14天前
|
关系型数据库 MySQL 项目管理
数据库大作业——基于qt开发的图书管理系统(四)项目目录的整理与绘制登录页面
数据库大作业——基于qt开发的图书管理系统(四)项目目录的整理与绘制登录页面
|
14天前
|
SQL 关系型数据库 MySQL
数据库大作业——基于qt开发的图书管理系统(三)Qt连接Mysql数据库
数据库大作业——基于qt开发的图书管理系统(三)Qt连接Mysql数据库

推荐镜像

更多