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;
}
目录
相关文章
|
4月前
|
安全 网络协议 数据安全/隐私保护
掌握Qt和C++:构建你的第一个P2P应用程序
掌握Qt和C++:构建你的第一个P2P应用程序
222 3
|
4月前
|
编译器 API C语言
深入探究Qt与C++标准的兼容之旅
深入探究Qt与C++标准的兼容之旅
494 3
|
2月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
135 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
2月前
|
存储 JSON 数据可视化
Qt(C++)使用QChart动态显示3个设备的温度变化曲线
Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。
192 1
|
3月前
|
数据处理 开发工具 C++
Qt C++ 扫码枪使用数据处理
Qt C++ 扫码枪使用数据处理
|
4月前
|
开发框架 Linux C++
Qt:强大的跨平台C++应用程序开发框架
Qt:强大的跨平台C++应用程序开发框架
170 3
|
4月前
|
开发框架 编译器 C++
Qt:一个强大的跨平台C++应用程序开发框架
Qt:一个强大的跨平台C++应用程序开发框架
139 1
|
1月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
43 0
|
18天前
|
23天前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
59 2