参考:
1、雨田哥:Qt之饼状图控件https://blog.csdn.net/ly305750665/article/details/97416937
2、feiyangqingyun:子自定义环形图https://blog.csdn.net/feiyangqingyun/article/details/98472081
效果图
头文件
#ifndef QWHPIEEX_H
#define QWHPIEEX_H
#include <QWidget>
#include <QPaintEvent>
#include <QResizeEvent>
#include <QMouseEvent>
#include <QPainter>
class QWHPieEx : public QWidget
{
Q_OBJECT
public:
struct PieData
{
QString name; //名称
float percent; //百分比
QColor color; //颜色
PieData()
{
this->name = "";
this->percent = 0;
this->color = QColor(0, 0, 0);
}
PieData(QString name, float percent, QColor color)
{
this->name = name;
this->percent = percent;
this->color = color;
}
};
explicit QWHPieEx(QWidget *parent = nullptr);
~QWHPieEx();
void setTitle(const QString &title);
QString getTitle() const;
void setTitleHeight(const int titleHeight);
int getTitleHeight() const;
void setLegendHeight(const int legendHeight);
int getLegendHeight() const;
void setLegendWidth(const int legendWidth);
int getLegendWidth() const;
void setPieDatasOut(const QList<PieData> &pieDatas);
void addPieDataOut(const PieData &pieData, int index);
void clearPieDatasOut();
void removePieDataOut(int index);
int getPieDatasOutCount() const;
void setPieDatasIn(const QList<PieData> &pieDatas);
void addPieDataIn(const PieData &pieData, int index);
void clearPieDatasIn();
void removePieDataIn(int index);
int getPieDatasInCount() const;
protected:
void paintEvent(QPaintEvent *);
void drawBg(QPainter *painter);
void drawTitle(QPainter *painter);
void drawOutCircle(QPainter *painter);
void drawOutPie(QPainter *painter);
void drawMidCircle(QPainter *painter);
void drawInPie(QPainter *painter);
void drawInCircle(QPainter *painter);
void drawOutLegend(QPainter *painter);
void drawInLegend(QPainter *painter);
void mouseMoveEvent(QMouseEvent *event);
void resizeEvent(QResizeEvent *);
private:
double degreeToRadius(double degree);
signals:
public slots:
private:
QString m_title; //标题名称
int m_titleHeight; //标题高度
QColor m_titleColor; //标题颜色
Qt::Alignment m_align; //标题位置
float m_titlePadding; //标题补白
int m_legendHeight; //图例高度
int m_legendWidth; //图例宽度
int m_legendColumnCount; //图例列数
QColor m_legendTextColor; //图例文字颜色
float m_legendLeftMargin; //图例左侧边距
float m_legendMargin; //图例边距
int m_pieTextSize; //饼图数据字体大小
QColor m_pieTextColor; //饼图数据字体颜色
bool m_pieJoinMargin; //饼图各模块连接处是否有缝隙
QColor m_pieJoinMarginColor; //饼图连接处及边缘颜色
float m_pieExpandSize; //饼图扩展后增加的半径
float m_outTextRadiusPercent; //外饼图显示的数据距中心点百分比
float m_inTextRadiusPercent; //内饼图显示的数据距中心点百分比
QColor m_bgColor; //背景颜色
QColor m_outCircleColor; //外圆颜色
QColor m_midCircleColor; //中圆颜色
QColor m_inCircleColor; //内圆颜色
int m_precision; //百分比精度
QVector<bool> m_mouseInPieOut; //光标是否在外饼图内
QVector<bool> m_mouseInPieIn; //光标是否在内饼图内
QList<PieData> m_pieDatasOut; //外饼图数据集合
QList<PieData> m_pieDatasIn; //内饼图数据集合
};
#endif // QWHPIEEX_H
核心代码
void QWHPieEx::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
//绘制背景
drawBg(&painter);
//绘制标题
drawTitle(&painter);
//绘制外圆
drawOutCircle(&painter);
//绘制外饼图
drawOutPie(&painter);
//绘制中间圆
drawMidCircle(&painter);
//绘制内饼图
drawInPie(&painter);
//绘制内圆
drawInCircle(&painter);
//绘制外饼图图例
drawOutLegend(&painter);
//绘制内饼图图例
drawInLegend(&painter);
}