当前位置: 首页 > article >正文

QT绘制同心扇形

void ChartForm::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);// 设置抗锯齿
    painter.save();

    // 设置无边框(不需要设置QPen,因为默认是不绘制边框的)
    QPen pen(Qt::NoPen);
    // QPen pen(Qt::black, 1);
    painter.setPen(pen);

    QRect rect;

    int step = 50;          // 内圈和外圈的距离
    int sRange = 8;         // 扇形向外绘制的范围(圈数)
    int numSlices = 16;     // 分成多少个扇形
    int lenght = 2 * step;  // 矩形边长
    // 计算扇形的中心点、半径、起始角度和跨度角度
    int centerX = width() / 2;
    int centerY = height() / 2;

    // 生成颜色(这里简单地使用彩虹色)
    QVector<QColor> colors;
    for (int i = 0; i <= sRange; ++i)
    {
        float hue = (float)i / sRange * 360.0f;
        colors.append(QColor::fromHsvF(hue / 360.0f, 1.0f, 1.0f));
    }

    // 绘制每个扇形
    for (int i = 0; i < numSlices; ++i)
    {
        double startAngle = i * 360.0f / numSlices;
        double spanAngle = 360.0f / numSlices;

        for(int idx = 1; idx <= sRange; idx ++)
        {
            QPoint startPt(centerX - idx * step, centerY - idx * step);
            rect.setRect(startPt.x(), startPt.y(), lenght + idx * lenght, lenght + idx * lenght);// 外圈

            int inRadius = idx * lenght;

            QRectF innerRect(startPt.x() + step, startPt.y() + step,inRadius,inRadius);// 内圈

            QPointF outStartPoint;
            outStartPoint.rx() += rect.center().x();
            outStartPoint.ry() = rect.center().y() - outStartPoint.y();

            QPainterPath path;// 创建一个QPainterPath对象
            path.moveTo(outStartPoint); //先移动到圆心
            path.arcTo(rect, startAngle, spanAngle);// 参数(矩形左上角坐标,弧的宽度,弧的高度,起始角,画多少度)
            path.arcTo(innerRect, startAngle + spanAngle, -spanAngle);// 参数(矩形左上角坐标,弧的宽度,弧的高度,起始角,画多少度)
            path.closeSubpath(); // 闭合路径(可选)
            painter.setBrush(colors[idx]);
            painter.drawPath(path);
        }
    }
    painter.restore();
}

执行结果如下图所示:

 


http://www.kler.cn/a/448368.html

相关文章:

  • ruoyi 请求参数类型不匹配,参数[giftId]要求类型为:‘java.lang.Long‘,但输入值为:‘orderGiftUnionList
  • 基于DockerCompose搭建Redis主从哨兵模式
  • 《庐山派从入门到...》板载按键启动!
  • 什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap
  • 渗透测试-前端加密分析之RSA加密登录(密钥来源服务器)
  • centos7下docker 容器实现redis主从同步
  • 小雅Alist缓存太多怎么清理?教程来了
  • ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。
  • powerdesigner导入sql脚本,生成物理模型,并显示comment名
  • 【html网页页面013】html+css制作节日主题圣诞节网页含视频、留言表单(独创首发-5页面附效果及源码)
  • SmartX分享:SMTX ZBS 中 RDMA 技术简介
  • springboot470基于协同过滤算法的东北特产销售系统的实现(论文+源码)_kaic
  • 优先队列【东北大学oj数据结构9-3】C++
  • 【故障处理系列--gitlab的CI流水线下载安装包提示报错】
  • 【Rust自学】3.6. 控制流:循环
  • 苍穹外卖-day05redis 缓存的学习
  • GFPS扩展技术原理(七)-音频切换消息流
  • 探索 JSON 数据在关系型数据库中的应用:MySQL 与 SQL Server 的对比
  • Obfuscator使用心得
  • 《开启微服务之旅:Spring Boot Web开发》(二)
  • Docker挂载
  • SQL 使用带聚集函数的联结
  • 【多维 DP】力扣3250. 单调数组对的数目 I
  • 情报信息收集能力
  • HR/TA/HRBP的关系
  • DDoS工作原理