QT绘制饼图

Posted manual-linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT绘制饼图相关的知识,希望对你有一定的参考价值。

QT版本:QT5.6.1

QT绘制饼图,出问题的代码如下

void DrawPieDialog::paintEvent(QPaintEvent *event)
{
    float startAngle=0;
    float spanAngle=( (qreal) (sell) / (qreal)(sell+last) ) *360;
    QPoint startPt(30,30);  //圆心
    QRect rect(startPt.x(), startPt.y(), 200, 200);
    QPainter p(this);
    int arcR = rect.width()/2;
    QPainterPath path;
    p.setBrush(Qt::green);

    path.moveTo(startPt.x() + arcR,startPt.y() + arcR);  //移动到圆心
    path.arcTo(rect,startAngle,spanAngle);
    p.drawPath(path);

    p.setBrush(Qt::red);
    path.moveTo(startPt.x() + arcR,startPt.y() + arcR);  //移动到圆心
    startAngle=spanAngle;
    spanAngle=360-startAngle;
    path.arcTo(rect,startAngle,spanAngle);
    p.drawPath(path);


    QRect rect2(250,175,20,20);
    QRect rect3(250,215,20,20);  //为了绘制方块用的变量
    //绘制方块
    p.setBrush(Qt::green);
    p.drawRect(rect2);
    p.setBrush(Qt::red);
    p.drawRect(rect3);
    //绘制文字
    p.drawText(QRectF(280,180,100,20),QString("已经销售的占比"));
    p.drawText(QRectF(280,220,100,20),QString("未销售的占比"));

}

解决办法:
1 使用更高版本的QT版本
?QT5.7以上版本支持QPieSeries + QPieSlice + QChart + QChartView等类,可以直接绘制饼图
2 修改代码如下

void DrawPieDialog::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    float startAngle=0;
    float spanAngle=( (qreal) (sell) / (qreal)(sell+last) ) *360;

    QPoint startPt(30,30);  //圆心
    QRect rect(startPt.x(), startPt.y(), 200, 200);
    int arcR = rect.width()/2;
    QList<QColor> colorList;

    for(int i = 0; i < 2; i++)
    {
        //生成随机颜色并过滤掉白色
        int colorR, colorG, colorB;
        while (1)
        {
            colorR = rand() % 256;
            colorG = rand() % 256;
            colorB = rand() % 256;

            if (colorR == 255 && colorG == 255 && colorB == 255)
            {
                continue;
            }
            else
            {
                break;
            }
        }
        QColor color(colorR, colorG, colorB);
        colorList.append(color);
        painter.setBrush(QBrush(color));
        //画扇形
        QPainterPath path;
        path.moveTo(startPt.x() + arcR,startPt.y() + arcR);  //移动到圆心
        if(i == 1)
        {
            startAngle=spanAngle;
            spanAngle=360-spanAngle;
        }
        path.arcTo(rect, startAngle, spanAngle);
        painter.drawPath(path);
    }  //end for
}

?绘图光滑需要设置:
painter.setRenderHint(QPainter::Antialiasing, true);
?效果图如下
技术分享图片

3 修改代码如下

参考资料
1 Qt之饼图 https://www.cnblogs.com/xinxue/p/6021873.html
2 Qt4.8.5以上版本绘制饼图 https://blog.csdn.net/Pailugou/article/details/82080829
3 关于QT的QPainterPath::arcTo 详解 https://www.cnblogs.com/yuzhould/p/9132493.html










以上是关于QT绘制饼图的主要内容,如果未能解决你的问题,请参考以下文章

饼图绘制

Qt 之 饼图

python添加饼图扇形面积

Qt+ECharts开发笔记:ECharts的饼图介绍基础使用和Qt封装百分比图Demo

100天精通Python(可视化篇)——第81天:matplotlib绘制不同种类炫酷饼图参数说明+代码实战(自定义百分比多个子图圆环嵌套饼图)

带着canvas去流浪 绘制饼图