Qt Chart柱状图实现

1.效果

在这里插入图片描述

2.描述

在安装Qt的时候必须勾选QChart模块,默认安装是不带这个模块的,如果没有需要重新安装。
工程下载链接 下载地址

3.代码

CHistogram.cpp

#include "CHistogram.h"

CHistogram::CHistogram(QWidget *parent)
    :QFrame(parent)
{
    initUI();
}

void CHistogram::refreshUI(QVector<int> vecData)
{
    if(vecData.isEmpty())
        return ;
    vecData.resize(7);
    for(int i = 0; i < vecData.size(); i++){
        m_pBarSet->replace(i,vecData.at(i));
    }
}

void CHistogram::initUI()
{
    this->resize(600,400);
    QFont fontText("SimHei");
    fontText.setPixelSize(12);

    QBarSeries *pBarSeries = new QBarSeries();
    pBarSeries->setLabelsVisible(true);
    pBarSeries->setLabelsFormat("@valueh");
    pBarSeries->setLabelsPosition(QAbstractBarSeries::LabelsInsideEnd);
    connect(pBarSeries,&QBarSeries::hovered,[=](bool bStatus,int index,QBarSet *pBarSet){ //鼠标悬浮柱状条
        Q_UNUSED(bStatus)
        Q_UNUSED(index)
        Q_UNUSED(pBarSet)
    });

    m_pBarSet = new QBarSet("运行时间");
    m_pBarSet->setBrush(QBrush("#dd5da4f2"));
    m_pBarSet->setBorderColor("#dd5da4f2");
    m_pBarSet->setLabelFont(fontText);
    *m_pBarSet<< 5 << 7 << 8 << 12 << 20 << 24 << 16;
    pBarSeries->append(m_pBarSet);


    /*X轴设置*/
    QBarCategoryAxis *pAxisX = new QBarCategoryAxis();
    QStringList strListDate;
    for(int i = 6;i >= 0; i--) {
        strListDate.append(QDate::currentDate().addDays(-i).toString("M.dd"));
    }
    pAxisX->append(strListDate);
    pAxisX->setGridLineColor("transparent");    //参考线颜色透明
    pAxisX->setLinePenColor("#5da4f2");         //标尺 线颜色
    pAxisX->setLabelsColor("#5da4f2");          //文本颜色
    pAxisX->setLabelsFont(fontText);
    /*Y轴设置*/
    QValueAxis *pAxisY = new QValueAxis();
    pAxisY->setTickCount(13); //包含0那一条横线
    pAxisY->setLabelFormat("%dh");
    pAxisY->setRange(0,24);
    pAxisY->setGridLineColor("#5da4f2");
    pAxisY->setLinePenColor("#5da4f2"); //标尺 线颜色
    pAxisY->setLabelsColor("#5da4f2");  //文本颜色
    pAxisY->setLabelsFont(fontText);

    QChart *pChart = new QChart();
    pChart->addSeries(pBarSeries);
    pChart->setTitle("一周运行时间");
    pChart->setAnimationOptions(QChart::SeriesAnimations);
    pChart->createDefaultAxes();
    pChart->setAxisX(pAxisX);
    pChart->setAxisY(pAxisY);
    pChart->legend()->setVisible(true); //设置图例为显示状态
    pChart->legend()->setAlignment(Qt::AlignBottom);//设置图例的显示位置在底部

    QChartView *pChartView = new QChartView(pChart,this);
    pChartView->setRenderHint(QPainter::Antialiasing);
    pChartView->resize(this->size());

}

CHistogram.h

#ifndef CHISTOGRAM_H
#define CHISTOGRAM_H

#include <QFrame>
#include <QChart>
#include <QBarSet>
#include <QChart>
#include <QBarSeries>
#include <QBarCategoryAxis>
#include <QChartView>
#include <QTime>
#include <QDebug>
#include <QStackedBarSeries>
#include <QValueAxis>
#include <QLabel>
#include <QCursor>
using namespace QtCharts;
class CHistogram : public QFrame
{
    Q_OBJECT
public:
    explicit CHistogram(QWidget *parent = 0);

    void refreshUI(QVector<int> vecData);
private:
    void initUI();

private:
    QBarSet *m_pBarSet = nullptr;
};

#endif // CHISTOGRAM_H

4.测试代码

Dialog.cpp

#include "Dialog.h"
#include <QDate>


Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    m_pH = new CHistogram(this);

    this->startTimer(2000);
}

Dialog::~Dialog()
{

}

void Dialog::timerEvent(QTimerEvent *event)
{
    static bool bIsa;
    bIsa = !bIsa;
    QVector<int> vec1;
    vec1<<1<<23<<3<<14<<12<<6<<7;

    QVector<int> vec2;
    vec2<<17<<6<<5<<18<<3<<12<<1;

    if(bIsa)
        m_pH->refreshUI(vec1);
    else
        m_pH->refreshUI(vec2);
}


Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QTimerEvent>
#include "CHistogram.h"

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

    void timerEvent(QTimerEvent *event);

    CHistogram *m_pH;
};

#endif // DIALOG_H

  • 2
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是唐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值