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

原文地址:https://www.cnblogs.com/Manual-Linux/p/10153918.html

时间: 2024-10-12 17:55:42

QT绘制饼图的相关文章

Qt之自绘制饼图

1.说明 最近在搞绘图方面的工作,说实话C++的第三方绘图库并不算多,总之我了解的有:qtcharts.ChartDirector.qwt.kdchart和QCustomPlot.这几个库各有利弊. qtcharts:qt5.7之后才开源的模块,支持绘制各种图标,并且功能相当丰富,但是可扩展性差,如果自己想高度定制,比较困难,主要是和qt的源码风格有决定性的关系. ChartDirector:开源的第三方绘图库,使用方便,推荐使用 qwt:主要绘制仪表盘类似的东西(这个库可以编译后加入qt帮助文

QT绘制系统简介

#3个类:QPainter,QPainterDevice 和 QPaintEngine 三个类 #qpainter用于执行绘制操作 #QPainterDevice是一个二维空间抽象,允许qpainter在其上面进行绘制,也就是qpainter工作空间 #QPaintEngine 提供了画笔(qpainter)在不同设备上进行绘制统一接口,QPaintEngine类应用于QPainter和QPaintDevice 之间,如果需要自定义一个设备时 #则不需要关心QPaintEngine 这个类的QP

qt绘制设备

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import  * from PyQt4.Qt import * from PyQt4 import QtGui, QtCore from PyQt4.QtCore import * import sys #说明:绘图设备是继承 QPainterDevice 的类. QPaintDevice 就是能够进行绘制的类,也就是说, # Q

c# 通过.net自带的chart控件绘制饼图pie chart

c# 通过.net自带的chart控件绘制饼图pie chart 需要实现的目标是: 1.将数据绑定到pie的后台数据中,自动生成饼图. 2.生成的饼图有详细文字的说明. 具体的实现步骤: >>前台界面的设置: 1.设置chart1的属性Legends中默认的Legend1的Enable为false: 2.设置Series的ChartType为Pie 3.设置Series显示的文字内容(此处比较关键) 至此,前台的设置完成. >>下面填写后台代码: List<string&g

UIGraphics 绘制饼图

相关设置没有写成宏定义,需要到里面改.自用版. // //  YJPieModel.h //  绘制饼图 // //  Created by pilgrim on 15/3/3. //  Copyright (c) 2015年 pilgrim. All rights reserved. // #import <Foundation/Foundation.h> @interface YJPieModel : NSObject //饼图数据 @property (nonatomic, strong

【带着canvas去流浪】 (3)绘制饼图

目录 一. 任务说明 二. 重点提示 三. 示例代码 四. hover高亮的实现思路 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址:[你要的前端打怪升级指南] 一. 任务说明 使用原生canvasAPI绘制饼图(南丁格尔玫瑰).(截图以及数据来自于百度Echarts官方示例库[查看示例链接]). 二. 重点提示 南丁格尔玫瑰图的画法有很多种,Echarts中提供的以半径或面积两种不同模

Qt绘制异形窗体

异形窗体即不规则窗体,一般采用png图片,一般绘制异形窗体分两步: 1.设置遮罩区 2.绘制图片   使用png图片的透明部分作为遮罩区,然后绘制图片,这样我们就看到一个只绘制了非透明部分的图形,废话少说,以实现绘制一只蝴蝶(蝴蝶为半透明)为例,效果如下: 头文件: 1: #include <QWidget> 2: class TransDialog : public QWidget 3: { 4: Q_OBJECT 5: public: 6: explicit TransDialog(QWi

Qt 学习之路 :Qt 绘制系统简介

Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类. QPainter用来执行绘制的操作:QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间:QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口.QPaintEngine类应用于QPainter和QPaintDevice

Qt 之 饼图

1  饼图 (pie chart) 1.1  Charts 模块 Qt 库由许多模块组成,其中的 Qt Charts,包含了一系列图表组件,使用前要在 .pro 中添加如下语句: QT += charts cpp 文件中,还需添加头文件和声明命名空间 #include <QtCharts> using namespace QtCharts; 1.2  代码示例 这是 Qt 5.7 中实现饼图的代码,#1 ~ #5 声明了头文件 1 #include <QtWidgets/QApplica