Qt——功能:绘制柱状图

测试环境:win10、Qt Creator 4.11.1、5.14.2版本SDK

 

绘制柱状图:

barChart.h 
#ifndef BARCHART_H
#define BARCHART_H

#include <QWidget>
#include <QPainter>
#include <QList>

class BarChart : public QWidget
{
    Q_OBJECT
public:
    struct OptionType
    {
        QString option;
        QString percent;
    };

public:
    explicit BarChart(QWidget *parent = nullptr);
    void setBarChartTemplate(const QString& barTemplate, const QString& answer, int x, int spacing);
    void setBarChartPercent(const QList<OptionType>& option);
    void initBarChart();

signals:

protected:
    void paintEvent(QPaintEvent *event) override;

private:
    QString m_barTemplate;
    QString m_answer;
    int m_startX;
    int m_spacing;
    const int m_barWidth;
    const int m_barHeight;
    QList<OptionType> m_optionList;

private:
    void drawBarChart(QPainter& painter, const QString& barType, bool isAnswer, int startX, const QString& percent);
};

#endif // BARCHART_H

barChart.cpp
#include "barchart.h"
#include <QStyleOption>
#include <QPainter>
#include <QDebug>

BarChart::BarChart(QWidget *parent) : QWidget(parent),
    m_answer(""),
    m_startX(0),
    m_spacing(10),
    m_barWidth(11),
    m_barHeight(70)
{
    resize(100, 100);
}

void BarChart::setBarChartTemplate(const QString& barTemplate, const QString& answer, int x, int spacing)
{
    m_answer = answer;
    m_barTemplate = barTemplate;
    m_startX = x;
    m_spacing = spacing;
}

void BarChart::setBarChartPercent(const QList<OptionType>& option)
{
    m_optionList.clear();
    m_optionList = option;

    update();
}

void BarChart::initBarChart()
{
    m_optionList.clear();

    update();
}

void BarChart::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    QPainter p(this);
    opt.init(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);

    QPainter painter(this);

    for(int i = 0; i < m_optionList.length(); ++i)
    {
        OptionType optionType = m_optionList.at(i);

        int index = m_barTemplate.indexOf(optionType.option);

        if(index >= 0)
        {
            bool isAnswer = false;

            if(m_answer.isEmpty())
            {
                isAnswer = true;
            }
            else
            {
                isAnswer  = (optionType.option == m_answer) ? true : false;
            }

            int startX = m_startX + index * (m_spacing + m_barWidth);

            drawBarChart(painter, optionType.option, isAnswer, startX, optionType.percent);
        }
    }
}

void BarChart::drawBarChart(QPainter& painter, const QString& barType, bool isAnswer, int startX, const QString& percent)
{
    //百分比
    QFont font;
    font.setPixelSize(12);
    painter.setFont(font);
    painter.setPen(QColor("#999999"));
    painter.setRenderHint(QPainter::Antialiasing);
    QRect optionAPercentRect(startX - 4, 0, 25, 17);
    int optionPercent = percent.isEmpty() ? 0 : (percent.toFloat() * 100);
    painter.drawText(optionAPercentRect, Qt::AlignCenter, QString("%1%").arg(optionPercent));

    //整体
    painter.setPen(QColor("#F5F5F5"));
    painter.setBrush(QColor("#F5F5F5"));
    QRect optionAHistogramRect(startX, 21, m_barWidth, m_barHeight);
    painter.drawRoundedRect(optionAHistogramRect, 2, 2);

    //投票
    if(0 != optionPercent)
    {
        QColor color;
        if(isAnswer)
        {
            color.setRgb(21,212,148);
        }
        else
        {
            color.setRgb(255,98,88);
        }

        painter.setPen(color);
        painter.setBrush(color);
        QRect voteARect(startX, 21 + ((100 - optionPercent) * m_barHeight / 100), m_barWidth, optionPercent * m_barHeight / 100);
        painter.drawRoundedRect(voteARect, 2, 2);
    }

    //选项
    font.setPixelSize(13);
    painter.setFont(font);
    painter.setPen(QColor("#222222"));
    QRect optionARect(startX + 2, 95, 9, 18);
    painter.drawText(optionARect, Qt::AlignCenter, barType);
}

main.cpp
#include <QApplication>
#include "barchart.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    BarChart bar;
    bar.setBarChartTemplate("ABC", "A", 60, 10);

    QList<BarChart::OptionType> optionTypeList;

    BarChart::OptionType optionA;
    optionA.option = "A";
    optionA.percent = QString::number(0.1);
    optionTypeList.append(optionA);

    BarChart::OptionType optionB;
    optionB.option = "B";
    optionB.percent = QString::number(0);
    optionTypeList.append(optionB);

    BarChart::OptionType optionC;
    optionC.option = "C";
    optionC.percent = QString::number(0.78);
    optionTypeList.append(optionC);

    bar.setBarChartPercent(optionTypeList);
    bar.show();

    return a.exec();
}

显示效果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值