Qt绘制饼图定制版

参考:
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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浮生卍流年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值