QCustomPlot之绘制柱形图、直线、清空图形方法

最近使用QCustomPlot绘制柱形图、直线时,遇到在同一个widget上显示需要把上一次绘制的图形删除的问题,费了很长时间才解决这个问题。在这里分享一下自己解决的办法,写了一个测试demo。

一、效果图如下:
这里写图片描述
二、核心代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    initCustomPlot();
    dealDrawLine();
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(dealDrawLine()));
    connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(dealDrawBarChart()));
}

Widget::~Widget()
{
    delete ui;
}
//************************************
// 函数名称: initCustomPlot()
// 函数说明:初始化
// 返 回 值: void
// 作    者:ISmileLi
// 作成日期:
// 修改记录:
//************************************
void Widget::initCustomPlot()
{
    ui->widget->resize(this->width(),this->height());
    ui->widget->xAxis->setVisible(true);
    ui->widget->yAxis->setVisible(true);
    /// 设置顶边线和右边线显示但不显示刻度值
    ui->widget->xAxis2->setVisible(true);
    ui->widget->xAxis2->setTickLabels(false);
    ui->widget->yAxis2->setVisible(true);
    ui->widget->yAxis2->setTickLabels(false);
    ui->widget->xAxis2->setTicks(false);
    ui->widget->yAxis2->setTicks(false);

    /// 设置顶边线和右边线随x、y变化而变化
    connect(ui->widget->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->widget->xAxis2, SLOT(setRange(QCPRange)));
    connect(ui->widget->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->widget->yAxis2, SLOT(setRange(QCPRange)));

    /// 设置拖拽、放大缩小功能
    ui->widget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
}
//************************************
// 函数名称:  绘制直线
// 函数说明:dealDrawLine()
// 返 回 值: void
// 作    者:ISmileLi
// 作成日期:
// 修改记录:
//************************************
void Widget::dealDrawLine()
{

   int plottableCount = ui->widget->plottableCount();
    if (plottableCount != 0)
         ui->widget->clearPlottables();

    ui->widget->xAxis->setRange(0, 9);
    ui->widget->yAxis->setRange(0, 9);
    ui->widget->setBackground(QBrush(QColor(Qt::gray)));

    QPen drawPen;
    drawPen.setColor(Qt::blue);
    drawPen.setWidth(1);
    QVector<double> xLineVector, yLineVector;
    xLineVector << 1 << 2 << 3 << 4 << 5 << 6 << 7;
    yLineVector << 4 << 1 << 2 << 4 << 5 << 6 << 7;
    QCPGraph * curGraph = ui->widget->addGraph();
    curGraph->setPen(drawPen);
    curGraph->setLineStyle(QCPGraph::lsLine);
    curGraph->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 2));
    curGraph->setData(xLineVector, yLineVector);
    ui->widget->replot();
}
//************************************
// 函数名称:   dealDrawBarChart()
// 函数说明: 绘制柱形图
// 返 回 值: void
// 作    者:ISmileLi
// 作成日期:
// 修改记录:
//************************************
void Widget::dealDrawBarChart()
{
    int plottableCount = ui->widget->plottableCount();
     if (plottableCount != 0)
          ui->widget->clearPlottables();

    ui->widget->xAxis->setRange(-1, 8);
    ui->widget->yAxis->setRange(-1, 12);
    QLinearGradient gradient(0, 0, 0, 400);
    gradient.setColorAt(0, QColor(90, 90, 90));
    gradient.setColorAt(0.38, QColor(100, 100, 100));
    gradient.setColorAt(1, QColor(70, 70, 70));
    ui->widget->setBackground(QBrush(gradient));

    QVector<double> xBarVector, yBarVector;
    xBarVector << 1 << 2 << 3 << 4 << 5 << 6 << 7;
    yBarVector << 0.86*10.5 << 0.83*5.5 << 0.84*5.5 << 0.52*5.8 << 0.89*5.2 << 0.90*4.2 << 0.67*11.2;
    QCPBars *rectBar = new QCPBars(ui->widget->xAxis, ui->widget->yAxis);
    rectBar->setAntialiased(false);
    rectBar->setStackingGap(1);
    rectBar->setPen(QPen(QColor(0, 168, 140).lighter(130)));
    rectBar->setBrush(QColor(0, 168, 140));
    rectBar->setData(xBarVector, yBarVector);
    ui->widget->replot();
}

说明:更多问题请参考博客中的其他文章。

猜你喜欢

转载自blog.csdn.net/toby54king/article/details/79033381