QT利用QPainter绘制三维饼状图

2022-07-14,,,,

一、项目介绍

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

二、项目基本配置

新建一个qt案例,项目名称为“pietest”,基类选择“qwidget”,取消选中创建ui界面复选框,完成项目创建。

三、ui界面设置

无ui界面

四、主程序实现

4.1 widget.h头文件

头文件中只需声明paintevent函数:

private:
    void paintevent( qpaintevent* e);

4.2 widget.cpp源文件

paintevent函数定义如下:

void widget::paintevent( qpaintevent* e)
{
    int start=240;//定义起始角度
    int ang=30;//定义角度范围

    qpainter painter(this);
    // 去除画笔
    painter.setpen(qt::nopen);
    // 设置反锯齿
    painter.setrenderhint(qpainter::antialiasing);
    //三维饼状图
    // 顶层圆面
    qrectf rect_top(10.0, 20.0, 280.0, 160.0);
    // 底层圆面(宽高相同,y在顶层圆面下方40处)
    qrectf rect_bottom(10.0, 60.0, 280.0, 160.0);
    // 中间矩形
    qrectf rect_midd(10.0, 100.0, 280.0, 40.0);
    // 扇形起始角度
    int startangle = start * 16;      //从230度
    // 扇形覆盖范围
    int spanangle = ang * 16;

    painter.setbrush(qcolor(97,35,35,255));//饼状图高度颜色
    // 绘制底层圆面
    painter.drawellipse(rect_bottom);
    // 绘制中间矩形
    painter.drawrect(rect_midd);

    painter.setbrush(qcolor(qt::darkyellow));//饼状图占比高度颜色
    // 绘制底层扇形
    painter.drawpie(rect_bottom, startangle, spanangle);

    // 扇形的弦与弧的交点
    double pi = 3.1415926;
    double dx1 = rect_top.width() * 0.5 * cos(start * pi / 180);
    double dy1 = rect_top.height() * 0.5 * sin(start * pi / 180);

    double dx2 = rect_top.width() * 0.5 * cos((start+ang) * pi / 180);
    double dy2 = rect_top.height() * 0.5 * sin((start+ang) * pi / 180);

    // 求交点的坐标值
    qpointf posbackcenter = qpointf(rect_top.center());
    double dx1 = posbackcenter.x() + dx1 + 0.5;
    double dy1 = posbackcenter.y() - dy1 + 0.5;

    double dx2 = posbackcenter.x() + dx2 + 0.5;
    double dy2 = posbackcenter.y() - dy2 + 0.5;

        // 记录交点
        qpointf topleft = qpointf(dx1, dy1);
        qpointf bottomright = qpointf(dx2, dy2) + qpointf(0,40);
        qpointf bottomleft = topleft + qpointf(0,40);
        painter.setbrush(qcolor(qt::darkyellow));

        // 绘制连接扇形的区域
        qpolygonf path;
        path << topleft << qpointf(dx2,dy2) << bottomright << bottomleft;
        painter.drawpolygon(path);

        // 绘制顶层圆面
        painter.setbrush(qcolor(156,56,56,255));
        painter.drawellipse(rect_top);

        // 绘制顶层扇形
        painter.setbrush(qcolor(qt::yellow));
        painter.drawpie(rect_top, startangle, spanangle);

    qwidget::paintevent(e);
}

其部分示意为:

五、效果演示

完整效果如下:

到此这篇关于qt利用qpainter绘制三维饼状图的文章就介绍到这了,更多相关qt qpainter饼状图内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

《QT利用QPainter绘制三维饼状图.doc》

下载本文的Word格式文档,以方便收藏与打印。