Qt 实现3维饼状图

QT 实现3d饼状图---3D pie chart 3d pie chart方法一:目前实现效果,就是用drawPie函数分别画上下间距相同并且startAgl和spanAgl相同的两组扇形(颜色可根据显示设置),请看如下效果图: 很明显这样还是不够的,其中所指位置是需要修补的区域,利用drawPolygon或者drawRect函数画所指区域即可实现修补。具体修补区域的每个点的坐标,可根据椭圆的参数方程x=acost,y=bsin 阅读详情

Qt 实现3维饼状图

一.思路

自从Qt5 引入 QChart 模块后,qt就大大增强了画图表的功能,如饼状图、柱形图、折线图、面积图等等。要知道,qt4时代,画个图表要不通过QPainter来画,要不通过第三方库来画,都是比较麻烦的。而qt5可以轻松画出二维的图表。
那么,如何画3D的饼状图图呢,此处介绍一种比较神奇的方法:
  我们知道,一个圆柱体,可以看成是N个圆在Z轴方向叠加而成,所以,要画一个高度为H的圆柱体,那么,只需要画H个依次向上叠加的圆即可,再配以不同的颜色。

二.实现

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>
#include <QPainter>

#define PI_VALUE 3.1415926

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    void drawText(QPainter *painter,QRectF rect,int startAngle,int spanAngle,QString text);

protected:
    void paintEvent( QPaintEvent* ev );
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <math.h>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//画文本
//关键是求文本起始坐标位置。此处,取扇形中分线上的中点。
void MainWindow::drawText(QPainter *painter,QRectF rect, int startAngle, int spanAngle, QString text)
{
    double rX = rect.width() / 2;   //圆弧半径  x方向
    double rY = rect.height() / 2;  //圆弧半径  Y方向

    //圆心
    double x0 = rect.x() + rX;
    double y0 = rect.y() + rY;
    qDebug()<<"_______________________";
    qDebug()<<"x0,y0: "<<x0<<y0;

    double mx,my;  //画文字的坐标位置
    int endAngle = startAngle + spanAngle / 2;
    if(spanAngle > 360)
        spanAngle -= 360;

    qDebug()<<"endAngle: "<<endAngle;
    if(endAngle == 0)
    {
        mx = x0 + rX / 2;
        my = y0;
    }
    else if(endAngle == 180)
    {
        mx = x0 - rX / 2;
        my = y0;
    }
    else if(endAngle == 90)
    {
        mx = x0;
        my = y0 - rY / 2;
    }
    else if(endAngle == 270)
    {
        mx = x0;
        my = y0 + rY / 2;
    }
    else if(endAngle > 0 && endAngle < 90)
    {
        mx = x0 + rX * cos(endAngle * PI_VALUE / 180) / 2;
        my = y0 - rY * sin(endAngle * PI_VALUE / 180) / 2;
    }
    else if(endAngle > 90 && endAngle < 180)
    {
        mx = x0 - rX * cos((180 - endAngle) * PI_VALUE / 180) / 2;
        my = y0 - rY * sin((180 - endAngle) * PI_VALUE / 180) / 2;
    }
    else if(endAngle > 180 && endAngle < 270)
    {
        mx = x0 - rX * cos((270 - endAngle) * PI_VALUE / 180) / 2;
        my = y0 + rY * sin((270 - endAngle) * PI_VALUE / 180) / 2;
    }
    else if(endAngle > 270 && endAngle < 360)
    {
        mx = x0 + rX * cos((360 - endAngle) * PI_VALUE / 180) / 2;
        my = y0 + rY * sin((360 - endAngle) * PI_VALUE / 180) / 2;
    }
    else
    {
        return;
    }

    int textSpace = 5;  //Y轴向下偏移一点点,看起来更加好
    painter->drawText(mx, my + textSpace, text);
}

void MainWindow::paintEvent(QPaintEvent *ev)
{
    QPainter painter(this);
    // 去除画笔
    painter.setPen(Qt::NoPen);
    // 设置反锯齿
    painter.setRenderHint(QPainter::Antialiasing);

    //******************************************** 圆饼图 *****************************************//
    int widWidth = this->width();
    int widHeight = this->height();

    int spaceH = 10;
    int spaceV = 0;
    int rectHeight = widHeight * 3 / 4;    //圆弧所在矩形高度
    int chartWidth = widWidth - 2 * spaceH;
    int chartHeight = widHeight - rectHeight - 2 * spaceV - spaceV;

    int normal = 20;     //正常
    int offline = 4;    //离线
    int abnormal = 3;   //异常
    int total = normal + offline + abnormal;

    //颜色
    QColor colorNormal = QColor(27,203,204);
    QColor colorDarkNormal = QColor(36,124,121);
    QColor colorOffline = QColor(225,180,225);
    QColor colorDarkOffline = QColor(144,118,144);
    QColor colorAbnormal = QColor(219,224,120);
    QColor colorDarkAbnormal = QColor(142,144,77);

    // 顶层圆面
    QRectF rect_top(spaceH, spaceV, chartWidth, rectHeight);
    // 底层圆面
    QRectF rect_bottom(spaceH, widHeight - rectHeight - 2 * spaceV, chartWidth, rectHeight);

    painter.setBrush(colorDarkNormal);
    // 绘制底层圆面
    painter.drawEllipse(rect_bottom);

    //计算3种情况扇形图的起始角和旋转角
    int startAngle_1 = 0;
    int spanAngle_1 = 360 *  normal / total;

    int startAngle_2 = startAngle_1 + spanAngle_1;
    int spanAngle_2 = 360 * offline / total;

    int startAngle_3 = startAngle_2 + spanAngle_2;
    int spanAngle_3 = 360 - spanAngle_1 - spanAngle_2;
    if(spanAngle_3 < 0)
        spanAngle_3 = 0;

    //循环画 chartHeight 个 扇形(虽然效率有点低哈)
    for(int i=0; i<chartHeight; i++)
    {
        QRectF rect(rect_bottom.x(),rect_bottom.y() - i,rect_bottom.width(),rect_bottom.height());
        if(normal > 0)
        {
            painter.setBrush(colorDarkNormal);
            painter.drawPie(rect, startAngle_1 * 16, spanAngle_1 * 16);
        }
        if(offline > 0)
        {
            painter.setBrush(colorDarkOffline);
            painter.drawPie(rect, startAngle_2 * 16, spanAngle_2 * 16);
        }
        if(abnormal > 0)
        {
            painter.setBrush(colorDarkAbnormal);
            painter.drawPie(rect, startAngle_3 * 16, spanAngle_3 * 16);
        }
    }

    // 绘制顶层圆面
    painter.setBrush(colorNormal);
    painter.drawEllipse(rect_top);

    // 绘制顶层扇形
    if(normal > 0)
    {
        painter.setBrush(colorNormal);
        painter.drawPie(rect_top, startAngle_1 * 16, spanAngle_1 * 16);
    }

    if(offline > 0)
    {
        painter.setBrush(colorOffline);
        painter.drawPie(rect_top, startAngle_2 * 16, spanAngle_2 * 16);
    }

    if(abnormal > 0)
    {
        painter.setBrush(colorAbnormal);
        painter.drawPie(rect_top, startAngle_3 * 16, spanAngle_3 * 16);
    }

    //画图例........................
    QPainter painterText(this);
    QFont font;
    font.setBold(true);
    font.setPixelSize(18);
    painterText.setFont(font);
    painterText.setPen(QColor(255,255,255));

    if(normal > 0)
        drawText(&painterText,rect_top,startAngle_1,spanAngle_1,QString::number(normal));

    if(offline > 0)
        drawText(&painterText,rect_top,startAngle_2,spanAngle_2,QString::number(offline));

    if(abnormal > 0)
        drawText(&painterText,rect_top,startAngle_3,spanAngle_3,QString::number(abnormal));

    QWidget::paintEvent(ev);
}

三.效果图

如下,缩放窗口时,图像也会同步改变。
3D饼状图显示

【QT】绘制饼状图 QPieSeries 相关链接: QT绘制直方图BarChart QT绘制折线图LineChart QT绘制曲线图SplineChart QT绘制散点图ScatterChart QT绘制散点图AreaChart 0.创建ui窗口: 主要就是拖拉一个Horizontal Layout 1.创建Qchart对象: QChart *chart = new QChart(); chart->setTitle("饼状图演示图"); //设置表格标题 2.创建QPieSeries对象: QPieSeries *series = 阅读详情

相关推荐

Qt用ECharts绘制饼状图(Qt与JS交互)——Qt

一、前言 又换工作了,再次回到Qt的怀抱,感觉过去半年多一点成长都没有。唉,郁闷。 回到正题,这次项目涉及到的东西很杂,其中涉及到了要绘制图表,我之前用的比较熟练的是Qt自带的QtChart,但这次Qt开发工具是5.5版本的,而 5.7才自带这个工具;所以根据当时的资源,选择了ECharts,上手快,图表类型多,又好看。 虽然,不是第一次用ECharts,但是也和第一次差不多,之前只涉及到了...

xiaopei_yan的博客 2971

Qt之QtDataVisualization各三维图表的简单使用(含源码+注释)

三维柱状图 三维散点图 三维曲面图 设置视角 水平视角 垂直视角 设置主题样式 设置系列样式 二维显示 槽函数的添加 using namespace QtDataVisualization; datavisualization Q3DBars QBar3DSeries QBarDataArray Q3DScatter QScatter3DSeries QScatterDataArray Q3DSurface QSurface3DSeries QSurfaceDataArray ......

lw的博客 1万+

【QT】——QChartView,QChart,QValueAxis类的使用,折线图,柱状图,饼状图的实现

QAbstractSeries类是数据集合,主要子类为QLineSeries——折线类,在QChart中添加QAbstractSeries,才可以展示出数据,否则QChart只能展现坐标轴。QAbstractSeries为系列的基类,其下又分为 QXYSeries类(折线图、样条曲线图、散点图的基类)、QPieSeries类(饼状图)、QAbstractBarSeries类(条状图)// 1.1 添加单个数据 不推荐// 1.2 添加单个数据 不推荐// 1.3 添加多个数据 不推荐。

sjp11的博客 1万+

十、Qt三维图表

【代码】十、Qt三维图表。

liutit的博客 3695

QT实现3D饼状图

在本文中,我们学习了如何使用Qt和OpenGL开发一个简单的三维饼图。我们首先创建了一个Qt窗口并将其与OpenGL上下文进行绑定,然后定义了饼图的数据并在OpenGL上下文中绘制饼图。最后,我们在Qt代码中创建了一个窗口并将PieChartWidget实例化,并将其添加到窗口中以显示图表。在本例中,我们将使用Qt和OpenGL来实现一个简单的3D饼图。最后,我们需要在 Qt 代码中创建一个窗口,将PieChartWidget实例化,并将其添加到窗口中以显示图表。接下来,我们将定义饼图的数据。

TechO_O的博客 473

QT绘制3D条形图(附完整源码)

QT绘制3D条形图(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 479

Qt实现柱状图、饼状图、折线图、曲线图

前言 未经允许,禁止转载 项目源码: 传送门 1.介绍 Qt图标(Qt Charts)出现晚于QWT、QCustomPlot,界面看起来也很优美,最主要的是要比后两种实现起来方便许多,当然,在自主灵活性上面就差了一点。 QChart已经集成在Qt5.7中,使用时在项目文件中加QT += charts即可,不过在安装Qt过程中,QChart默认时不勾选的,在安装时需要用户自行勾选。 2.效果 柱状图:可设置标题栏,X轴标题, Y轴标题,柱形颜色,轴刻度,是否显示提示信息(柱形颜色含义)等 饼状图:可设置空

专注音视频底层算法与工程实现,深入解析数字信号处理。深入研究WebRTC 3A、多麦声源定位、vad、语音识别等技术 1万+

QT实现三维角度饼

接着,在主窗口类中定义一个Q3DPieSeries对象,并将每个角度对应的数据项添加到该对象中。Q3DPieSeries对象是QT提供的用于三维饼图绘制的类,它有多种属性可以方便地设置,如半径、偏移量等。通过对数据项的添加和展示效果的设置,可以方便地实现更加复杂和丰富的角度饼图。接下来,需要将Q3DPieSeries对象添加到QChartView对象中,并设置一些展示效果,如背景色、标题等。最后,需要在主窗口类的构造函数中设置一些窗口属性,如窗口标题、大小等,并显示出来。至此,我们已经完成了这个任务。

ScriptCharm的博客 137

Qt中创建饼状图

Qt中创建饼状图 1.必要设置 .pro文件 QT += charts 头文件 #include <QtCharts> QT_CHARTS_USE_NAMESPACE namespace Ui { class MainWindow; } 2.初始化设置 void MainWindow::initPiewData() { QChart *chart = new QChart();//创建图表 chart->setTitle("PiewChart演示");//图表标题

ppss177的博客 1925

Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例

Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例。在开发过程中我们会使用多各种各样的图,讲数据进行可视化。我们可以使用以上几种图来表达我们的数据。Qt提供了一些可视化图的库Qchart,我们可以利用他开发自己想要图表。

啊渊的专栏 7842

QChart教程(二):VS2017 Qt使用QChart实现柱状图,饼状图

VS中安装的Qt无法使用 QT += charts 这种形式包含QChart模块,在VS包含该头文件也是能实现的。在VS2017中新建一个Qt GUI工程,上篇博客用布局器显示,这次用QChartView展示QChart。 打开.ui文件,拖一个Widget到界面上: 在widget上点击右键,将widget提升为QChartView. 保存。...

琅嬛福地 5130

QT5 饼状图、圆环图

饼状图pie chart,饼pie; 这里需要用到的四个类QChartView(相当于画布),QChart (相当于画笔),QPieSeries (相当于整个饼)、QPieSlice (相当于饼的每一块) 1、配置.pro文件 QT +=charts 2、引用头文件,加命名空间 #include <QtCharts/QChartView> #include <QtCharts...

yky189的博客 1960

QT绘制分离饼状图

QT绘制分离饼状图

希望我的博客,能帮上你解决学习中工作中所遇到的问题 767

Drilldown饼状图

饼状图每一块下面还有一个饼状图。这里用QT官方的例子做个笔记。 QT += charts 基本思路: 1、新建一个类DrilldownSlice继承自QPieSlice类, 实现3个方法: - updateLabel()//设置标题内容 - showHighlight(bool show)//是否显示数值可见和突出显示 - drilldownSeries()返回构造函数里存储的对象 2、新...

yky189的博客 736

Qt数据可视化(QPieSeries饼状图)

饼状图常用于统计学模型。有2D与3D饼状图,2D饼状图为圆形,手画时,常用圆规作图。饼状图显示一个数据系列(数据系列:在图表中绘制的相关数据点,这些数据源自数据表的行或列。图表中的每个数据系列具有唯一的颜色或图案并且在图表的图例中表示。可以在图表中绘制一个或多个数据系列。饼状图只有一个数据系列。)中各项的大小与各项总和的比例。饼状图中的数据点(数据点:在图表中绘制的单个值,这些值由条形、柱形、折线、饼状图或圆环图的扇面、圆点和其他被称为数据标记的图形表示。相同颜色的数据标记组成一个数据系列。)...

啊渊的专栏 3264

QT实现饼状图的绘制方法

饼状图,又称为饼图,是一种将数据量以扇区面积的形式展现的圆形统计图表。每个扇区的角度与它所表示的数据量成正比,其大小与相应数据值在总数据值中的比例有关。饼状图广泛应用于市场分析、销售数据、投票结果和其他需要展示各部分与整体关系的场合。当需要绘制一些不规则或者复杂的形状时,我们通常会使用路径(Path)。路径是由多个形状组合而成,并且可以进行复杂的图形操作,如路径的合并、分割和布尔运算。在下面的代码中,我们展示了如何使用路径来创建一个星形图案:// 创建一个路径对象// 添加一个起始点。

weixin_32687875的博客 812

Qt实战案例(49)——利用QPainter实现三维饼状图的绘制

本文介绍利用QPainter实现三维饼状图的绘制,由于Qt中没有三维饼状图的绘制组件,因此只能自行绘制。

Wendy的博客 1480

qt 三维饼状图

网上搜集的qt三维饼状图、柱状图绘制源代码,带有动画效果

上一篇: QT 跟踪鼠标轨迹
下一篇: Qt 设置窗口边框
不是很大锅
博客等级 码龄10年 34粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

不是很大锅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值