• Qt开发技术:QCharts(四)QChart面积图介绍、Demo以及代码详解


     

    前言

      红胖子,来也!
      按照顺序,本章为面积图。

     

    补充

      QCharts所有的图表都依赖《Qt开发技术:QCharts(一)QCharts基本介绍以及图表框架详解》中的QChart、QChartView、QLegend、QValueAxis。

     

    Demo

      在这里插入图片描述
      在这里插入图片描述

     

    Demo下载地址

      当前为v1.1.0版本
      CSDN:https://download.csdn.net/download/qq21497936/12753524
      QQ群:1047134658(点击“文件”搜索“qChartsTools”,群内与博文同步更新)

     

    面积图

    概述

      面积图是使用QAreaSeries类或AreaSeries QML类型实现的。默认情况下,X轴被用作一个边界和QLineSeries或线列作为另一个。但是,可以使用QLineSeries或LineSeries作为两个边界。
      在这里插入图片描述

     

    QAreaSeries(面积图类)

    概述

      QAreaSeries类在面积图中显示数据。
      面积序列用于显示定量数据。它是基于一系列线,用颜色强调边界线之间的区域。由于区域序列基于行序列,QAreaSeries构造函数需要一个QLineSeries实例,该实例定义区域的上边界。默认情况下,使用绘图区域底部作为下边界绘制面积图。下边界可以由另一条线指定,而不是绘图区域的底部。在这种情况下,QAReaSeries应该用两个QLineSeries实例初始化。
      注意:当下边界值大于上边界值时,术语上下边界可能会产生误导。重点是这两条边界线之间的区域将被填充。
      在这里插入图片描述
      下面的代码片段说明了如何创建基本面积图:

    _pLineSeries = new QLineSeries;
    _pLineSeries2 = new QLineSeries;
    _pLineSeries3 = new QLineSeries;
    _pLineSeries4 = new QLineSeries;
    // 方式一:逐一添加,大批量数据较慢
    _pLineSeries->append(0, qrand()%11);
    _pLineSeries->append(1, qrand()%11);
    _pLineSeries->append(2, qrand()%11);
    _pLineSeries->append(3, qrand()%11);
    _pLineSeries->append(4, qrand()%11);
    _pLineSeries->append(5, qrand()%11);
    _pLineSeries->append(6, qrand()%11);
    _pLineSeries->append(7, qrand()%11);
    _pLineSeries->append(8, qrand()%11);
    _pLineSeries->append(9, qrand()%11);
    _pLineSeries->append(10, qrand()%11);
    _pLineSeries->setName("通道1");
    _pLineSeries->setPen(QPen(QColor(qrand()%256, qrand()%256, qrand()%256), 2));
    // 通用:将数据插入到图表中
    _pAreaSeries = new QAreaSeries();
    _pAreaSeries->setName("面积1");
    _pLineSeries->setPointsVisible(true);
    _pLineSeries->setPointLabelsFormat("(@xPoint,@yPoint)");
    _pAreaSeries->setUpperSeries(_pLineSeries);
    _pChart->addSeries(_pAreaSeries);
    

      效率更高的方式为:

    // 方式二:逐一添加,大批量数据插入
    QList<QLineSeries *> list;
    list.append(_pLineSeries);
    list.append(_pLineSeries2);
    list.append(_pLineSeries3);
    list.append(_pLineSeries4);
    for(int index = 0; index < 4; index++)
    {
        QList<QPointF> listPointF;
        for(int index = 0; index < 11; index++)
        {
            listPointF << QPointF(index, qrand()%11);
        }
        list.at(index)->append(listPointF);
        list.at(index)->setName(QString("通道%1").arg(index+1));
        list.at(index)->setPen(QPen(QColor(qrand()%256, qrand()%256, qrand()%256), 2));
    }
    // 通用:将数据插入到图表中
    _pAreaSeries = new QAreaSeries();
    _pAreaSeries->setName("面积1");
    _pLineSeries->setPointsVisible(true);
    _pLineSeries->setPointLabelsFormat("(@xPoint,@yPoint)");
    _pAreaSeries->setUpperSeries(_pLineSeries);
    _pChart->addSeries(_pAreaSeries);
    
    _pAreaSeries2 = new QAreaSeries();
    _pAreaSeries2->setName("面积2");
    _pAreaSeries2->setUpperSeries(_pLineSeries2);
    _pChart->addSeries(_pAreaSeries2);
    
    _pAreaSeries3 = new QAreaSeries();
    _pAreaSeries3->setName("面积3");
    _pAreaSeries3->setUpperSeries(_pLineSeries3);
    _pAreaSeries3->setLowerSeries(_pLineSeries2);
    _pChart->addSeries(_pAreaSeries3);
    _pAreaSeries4 = new QAreaSeries();
    _pAreaSeries4->setName("面积4");
    _pAreaSeries4->setUpperSeries(_pLineSeries4);
    _pAreaSeries4->setLowerSeries(_pLineSeries3);
    _pChart->addSeries(_pAreaSeries4);
    
     

    Demo核心代码解析

    建立QChart显示框架

    AreaChartWidget::AreaChartWidget(QWidget *parent) :
        QWidget(parent),
        _pChartView(0),
        _pChart(0),
        _pXValueAxis(0),
        _pYValueAxis(0),
        _pLegend(0),
        _pLineSeries(0),
        _pLineSeries2(0),
        _pLineSeries3(0),
        _pLineSeries4(0),
        _pAreaSeries(0),
        _pAreaSeries2(0),
        _pAreaSeries3(0),
        _pAreaSeries4(0)
    {
        _pChartView = new QChartView(this);
        _pChart = new QChart();
        initData();
    }
    

    初始化数据

    void AreaChartWidget::initData()
    {
        _pLineSeries = new QLineSeries;
        _pLineSeries2 = new QLineSeries;
        _pLineSeries3 = new QLineSeries;
        _pLineSeries4 = new QLineSeries;
        // 方式一:逐一添加,大批量数据较慢
        _pLineSeries->append(0, qrand()%11);
        _pLineSeries->append(1, qrand()%11);
        _pLineSeries->append(2, qrand()%11);
        _pLineSeries->append(3, qrand()%11);
        _pLineSeries->append(4, qrand()%11);
        _pLineSeries->append(5, qrand()%11);
        _pLineSeries->append(6, qrand()%11);
        _pLineSeries->append(7, qrand()%11);
        _pLineSeries->append(8, qrand()%11);
        _pLineSeries->append(9, qrand()%11);
        _pLineSeries->append(10, qrand()%11);
        _pLineSeries->setName("通道1");
        _pLineSeries->setPen(QPen(QColor(qrand()%256, qrand()%256, qrand()%256), 2));
        // 通用:将数据插入到图表中
        _pAreaSeries = new QAreaSeries();
        _pAreaSeries->setName("面积1");
        _pLineSeries->setPointsVisible(true);
        _pLineSeries->setPointLabelsFormat("(@xPoint,@yPoint)");
        _pAreaSeries->setUpperSeries(_pLineSeries);
        _pChart->addSeries(_pAreaSeries);
    
        // 方式二:逐一添加,大批量数据插入
        QList<QLineSeries *> list;
        list.append(_pLineSeries);
        list.append(_pLineSeries2);
        list.append(_pLineSeries3);
        list.append(_pLineSeries4);
        for(int index = 1; index < 4; index++)
        {
            QList<QPointF> listPointF;
            for(int index = 0; index < 11; index++)
            {
                listPointF << QPointF(index, qrand()%11);
            }
            list.at(index)->append(listPointF);
            list.at(index)->setName(QString("通道%1").arg(index+1));
            list.at(index)->setPen(QPen(QColor(qrand()%256, qrand()%256, qrand()%256), 2));
        }
        // 通用:将数据插入到图表中
        _pAreaSeries2 = new QAreaSeries();
        _pAreaSeries2->setName("面积2");
        _pAreaSeries2->setUpperSeries(_pLineSeries2);
        _pChart->addSeries(_pAreaSeries2);
    
        _pAreaSeries3 = new QAreaSeries();
        _pAreaSeries3->setName("面积3");
        _pAreaSeries3->setUpperSeries(_pLineSeries3);
        _pAreaSeries3->setLowerSeries(_pLineSeries2);
        _pChart->addSeries(_pAreaSeries3);
    
        _pAreaSeries4 = new QAreaSeries();
        _pAreaSeries4->setName("面积4");
        _pAreaSeries4->setUpperSeries(_pLineSeries4);
        _pAreaSeries4->setLowerSeries(_pLineSeries3);
        _pChart->addSeries(_pAreaSeries4);
    
    
        // 通用:X轴和Y轴的处理(先插入数据再处理轴,否则不会有轴)
        _pChart->createDefaultAxes();
        _pYValueAxis = dynamic_cast<QValueAxis *>(_pChart->axisY());
    //    _pYValueAxis = new QValueAxis(_pChart);
        _pYValueAxis->setRange(0, 10);
        _pYValueAxis->setLinePen(QPen(Qt::black, 1));
        // tick
        _pYValueAxis->setTickCount(5);
        _pYValueAxis->setGridLinePen(QPen(Qt::gray, 1));
        _pYValueAxis->setGridLineVisible(true);
        // subTick
        _pYValueAxis->setMinorTickCount(4);
        _pYValueAxis->setMinorGridLineVisible(true);
        _pYValueAxis->setLabelFormat("%d");
    //    _pChart->addAxis(_pYValueAxis, Qt::AlignLeft);
    
        _pXValueAxis = dynamic_cast<QValueAxis *>(_pChart->axisX());
    //    _pXValueAxis = new QValueAxis(_pChart);
        _pXValueAxis->setRange(0, 10);
        _pXValueAxis->setLinePen(QPen(Qt::black, 1));
        // tick
        _pXValueAxis->setTickCount(5);
        _pXValueAxis->setGridLinePen(QPen(Qt::gray, 1));
        _pXValueAxis->setGridLineVisible(true);
        // subTick
        _pXValueAxis->setMinorTickCount(4); // 相反
        _pXValueAxis->setMinorGridLineVisible(true);
        _pXValueAxis->setLabelFormat("%d s");
    //    _pChart->addAxis(_pXValueAxis, Qt::AlignBottom);
    
        // 通用:视图显示设置为图表
        _pChartView->setRubberBand(QChartView::NoRubberBand);   // 不缩放
        _pChartView->setDragMode(QChartView::NoDrag);   // 拽拖:需要自己重写QCharView
        _pChartView->setChart(_pChart);
    
    
        // 标识
        _pLegend = _pChart->legend();
        _pLegend->setAlignment(Qt::AlignRight);
    
        // 平滑
        _pChartView->setRenderHint(QPainter::Antialiasing, true);
        // 阴影
        _pChart->setDropShadowEnabled(true);
    }
    

    设置数据线是否显示(标签显示会同步)

    void AreaChartWidget::setDataVisible(int index, bool visible)
    {
        if(index < 0 || index > 3)
        {
            return;
        }
        QList<QAreaSeries *> list;
        list.append(_pAreaSeries);
        list.append(_pAreaSeries2);
        list.append(_pAreaSeries3);
        list.append(_pAreaSeries4);
        list.at(index)->setVisible(visible);
    }
    

    设置主题样式

    void AreaChartWidget::setTheme(QChart::ChartTheme theme)
    {
        _pChart->setTheme(theme);
    }
    

    设置动画模式

    void AreaChartWidget::setAnimationOptions(QChart::AnimationOption option)
    {
        _pChart->setAnimationOptions(option);
    }
    

    设置标签显示位置

    void AreaChartWidget::setAlignment(Qt::Alignment align)
    {
        _pLegend->setAlignment(align);
    }
    

    设置标签是否可见

    void AreaChartWidget::setLegendVisible(bool visible)
    {
        _pLegend->setVisible(visible);
        _pChartView->setRenderHint(QPainter::Antialiasing);
    }
    

    设置是否绘制平滑

    void AreaChartWidget::setAntialiasing(bool antialiasing)
    {
        _pChartView->setRenderHint(QPainter::Antialiasing, antialiasing);
    }
    

    设置是否有阴影

    void AreaChartWidget::setShadow(bool shadow)
    {
        _pChart->setDropShadowEnabled(shadow);
    }
    

    是否显示数据点(新增)

    void AreaChartWidget::setPointVisible(bool visible)
    {
        _pAreaSeries->setPointsVisible(visible);
        _pAreaSeries2->setPointsVisible(visible);
        _pAreaSeries3->setPointsVisible(visible);
        _pAreaSeries4->setPointsVisible(visible);
    }
    

    是否显示数据点坐标(新增)

    void AreaChartWidget::setPointLabelVisible(bool visible)
    {
        _pAreaSeries->setPointLabelsFormat("(@xPoint,@yPoint)");
        _pAreaSeries->setPointLabelsVisible(visible);
        _pAreaSeries2->setPointLabelsFormat("(@xPoint,@yPoint)");
        _pAreaSeries2->setPointLabelsVisible(visible);
        _pAreaSeries3->setPointLabelsFormat("(@xPoint,@yPoint)");
        _pAreaSeries3->setPointLabelsVisible(visible);
        _pAreaSeries4->setPointLabelsFormat("(@xPoint,@yPoint)");
        _pAreaSeries4->setPointLabelsVisible(visible);
    }
    

    重置随机数据

    void AreaChartWidget::resetData()
    {
        _pChart->removeAllSeries();
        _pLineSeries = new QLineSeries;
        _pLineSeries2 = new QLineSeries;
        _pLineSeries3 = new QLineSeries;
        _pLineSeries4 = new QLineSeries;
    
        QList<QLineSeries *> list;
        list.append(_pLineSeries);
        list.append(_pLineSeries2);
        list.append(_pLineSeries3);
        list.append(_pLineSeries4);
        for(int index = 0; index < 4; index++)
        {
            QList<QPointF> listPointF;
            for(int index = 0; index < 11; index++)
            {
                listPointF << QPointF(index, qrand()%11);
            }
            list.at(index)->append(listPointF);
            list.at(index)->setName(QString("通道%1").arg(index+1));
            list.at(index)->setPen(QPen(QColor(qrand()%256, qrand()%256, qrand()%256), 2));
        }
    
        _pAreaSeries = new QAreaSeries();
        _pAreaSeries->setName("面积1");
        _pAreaSeries->setUpperSeries(_pLineSeries);
    
        _pAreaSeries2 = new QAreaSeries();
        _pAreaSeries->setName("面积2");
        _pAreaSeries2->setUpperSeries(_pLineSeries2);
        _pChart->addSeries(_pAreaSeries2);
    
        _pAreaSeries3 = new QAreaSeries();
        _pAreaSeries3->setName("面积3");
        _pAreaSeries3->setUpperSeries(_pLineSeries3);
        _pAreaSeries3->setLowerSeries(_pLineSeries2);
        _pChart->addSeries(_pAreaSeries3);
    
        _pAreaSeries4 = new QAreaSeries();
        _pAreaSeries4->setName("面积4");
        _pAreaSeries4->setUpperSeries(_pLineSeries3);
        _pAreaSeries4->setLowerSeries(_pLineSeries4);
        _pChart->addSeries(_pAreaSeries4);
    
        _pChart->addSeries(_pAreaSeries);
        resetColor();
    }
    

    初始化颜色

    void AreaChartWidget::resetColor()
    {
        QList<QLineSeries *> list;
        list.append(_pLineSeries);
        list.append(_pLineSeries2);
        list.append(_pLineSeries3);
        list.append(_pLineSeries4);
        for(int index = 0; index < list.size(); index++)
        {
            list.at(index)->setColor(QColor(qrand()%256, qrand()%256, qrand()%256));
        }
    }
    
     

    工程模板:对应版本号v1.1.0

      对应版本号v1.1.0
      增加面积图
      对折线图、曲线图和面积图增加数据点显示、数据点标签显示

     
  • 相关阅读:
    5. 添加后台管理页面
    4. 整合MyBatis
    3. 添加多个控制器
    2. 引入springmvc
    1. 开篇-springboot环境搭建
    去除angularjs路由的显眼的#号
    EasyUI DataGrid 分页实现示例
    等待对话框实现
    使用Struts2搭建登录注册示例
    观察者模式
  • 原文地址:https://www.cnblogs.com/qq21497936/p/13567850.html
Copyright © 2020-2023  润新知