QCustomPlot实现柱状图 动态显示

1、创建工程添加qcustomplot.cpp和qcustomplot.h

如下图所示:

2、在ui界面添加QWidget控件提升为QCustomPlot类


3、修改mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTimer *timer = new QTimer(this);
    timer->start(1000);
    connect(timer,SIGNAL(timeout()),this,SLOT(SimpleDemo()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::SimpleDemo()
{
    QVector<QString> labels(5);
    QVector<double> values(5);
    QTime t;
    t=QTime::currentTime();
    qsrand(t.msec()+t.second()*1000);
    //n=qrand()%25+5;

    for(int i=0;i<5;++i)
        values[i]=qrand()%25+1;
    for(int i=0;i<5;++i)
        labels[i]=QString("MAC")+('0'+i);

    QCPBars* bars=new QCPBars(this->ui->widget->xAxis,this->ui->widget->yAxis);
    //bars->brush();
    this->ui->widget->clearPlottables();

        QVector<double> index(5);
        for(int i=0;i<5;++i)
            index[i]=i;
        bars->setData(index,values);


    //QCPBars的setData()的两个参数也是两个向量,只不过第一个向量index的每个元素表示“第几个柱子”,然后后面对应的values表示对应“柱子的值”
    //添加完了绘制的柱状图,接下来添加标签,要想完全自己定义标签,需要先执行以下代码关闭默认的底部标签自动生成


    this->ui->widget->xAxis->setAutoTicks(false);
        this->ui->widget->xAxis->setAutoTickLabels(false);
        this->ui->widget->xAxis->setAutoTickStep(false);
    //先将bars添加到widget上吧,然后自动调整下坐标系

    this->ui->widget->addPlottable(bars);
        this->ui->widget->rescaleAxes();


    //接下来我们要生成我们标签的位置坐标,有个公式计算,其生成的向量 coor里面就对应了我的labels的坐标,注意这个坐标不是屏幕像素坐标,而是它这个坐标系的坐标,如果不是很明白就把上面的那三个false改为true看下它默认的坐标。
    double wid=this->ui->widget->xAxis->range().upper-this->ui->widget->xAxis->range().lower;
        double cl=bars->width()+(1.0*wid-bars->width()*5)/4;

        QVector<double> coor;
        for(int i=0;i<5;++i)
            coor.append(this->ui->widget->xAxis->range().lower+i*cl+bars->width()/2);
        this->ui->widget->xAxis->setTickVector(coor);
        this->ui->widget->xAxis->setTickVectorLabels(labels);


    //最后replot一下
    this->ui->widget->replot();
    //SimpleDemo(this->ui->widget,tempnum,n);
}


4、修改mainwindows.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <qtimer.h>
#include <QVector>
#include <QTimer>
#include <QTime>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void SimpleDemo();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

5、运行
可实现柱状图动态显示。


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wz2051900044

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值