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();
}
说明:更多问题请参考博客中的其他文章。
本文为博主原创文章,未经博主允许请勿转载!作者:ISmileLi