qchart怎么提升_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 list;

list.append(_pLineSeries);

list.append(_pLineSeries2);

list.append(_pLineSeries3);

list.append(_pLineSeries4);

for(int index = 0; index < 4; index++)

{

QList 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 list;

list.append(_pLineSeries);

list.append(_pLineSeries2);

list.append(_pLineSeries3);

list.append(_pLineSeries4);

for(int index = 1; index < 4; index++)

{

QList 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(_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(_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 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 list;

list.append(_pLineSeries);

list.append(_pLineSeries2);

list.append(_pLineSeries3);

list.append(_pLineSeries4);

for(int index = 0; index < 4; index++)

{

QList 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 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

增加面积图

对折线图、曲线图和面积图增加数据点显示、数据点标签显示

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值