测试环境: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();
}
显示效果: