• Qt之图形(简笔画-绘制漂亮的西瓜)


    简述

    Summer is coming…我们呢,为大家准备了丰盛的佳果-西瓜,清爽解渴,甘味多汁。

    一笔一划学简笔画,分分钟让你掌握一门新技能,下面我们来绘制一个“盛夏之王”-西瓜,赶快一起来试试吧。

    简笔画

    我们先简单看看西瓜的基本组成,一步步进行拆分、组合。

    这里写图片描述

    绘制

    效果

    具体的效果如下所示,我们可以再进行更好的完善。

    这里写图片描述

    源码

    主要分为以下三部:

    • 绘制外圆(绿色部分)
    • 绘制内圆(红色部分)
    • 绘制椭圆(西瓜子)

    注意:绘制西瓜子的时候,由于西瓜子随机分布在西瓜中,所以我们使用了随机数来表示区域,并判断西瓜子是否在内圆中(西瓜子肯定要在西瓜内O__O”…)。

    void MainWindow::paintEvent(QPaintEvent *)
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        QPainterPath path;
    
        // 起始点(矩形左上角坐标)
        QPoint startPoint(50, 10);
        // 外部矩形宽度的1/2(外部圆半径)
        int nOuterRadius = 150;
        // 内部矩形宽度的1/2(内部圆半径)
        int nInnerRadius = 150;
        int nInnerHeightRadius = 120;
        // 间距
        int nSpacing = nOuterRadius - nInnerHeightRadius;
    
        QPointF rightPoint(startPoint.x() + nOuterRadius * 2, startPoint.y() + nOuterRadius);
        QRect outerRect(startPoint.x(), startPoint.y(), nOuterRadius * 2, nOuterRadius * 2);
        QPointF leftPoint(startPoint.x(), startPoint.y() + nInnerHeightRadius + nSpacing);
        QRect innerRect(startPoint.x(), startPoint.y() + nSpacing, nInnerRadius * 2, nInnerHeightRadius * 2);
    
        // 1.绘制外圆(绿色部分)
        path.moveTo(rightPoint);
        path.arcTo(outerRect, 180, 180);
        path.closeSubpath();
        painter.setPen(Qt::black);
        painter.setBrush(QColor(5, 150, 60));
        painter.drawPath(path);
    
        path = QPainterPath();
        // 2.绘制内圆(红色部分)
        path.moveTo(leftPoint);
        path.arcTo(innerRect, 180, 180);
        path.closeSubpath();
        painter.setPen(Qt::black);
        painter.setBrush(Qt::red);
        painter.drawPath(path);
    
        // 3.生成椭圆(西瓜子)
        QPainterPath seedsPath = QPainterPath();
    
        qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
    
        // 用来判断椭圆范围
        for (int i = innerRect.left(); i < innerRect.left() + innerRect.width(); i += 30)
        {
            for(int j = innerRect.top() + nInnerHeightRadius; j < innerRect.top() + nInnerHeightRadius * 2; j += 20)
            {
                // 随机数(西瓜子随机分布在西瓜中)
                int nX = qrand() % 30;
                int nY = qrand() % 30;
                // 当椭圆在内部路径内时,添加至绘制路径(西瓜子肯定要在西瓜内O__O"…)
                QRect rect(i + nX, j + nY, 6, 10);
                if (path.contains(rect))
                    seedsPath.addEllipse(rect);
            }
        }
    
        painter.setPen(Qt::NoPen);
        painter.setBrush(Qt::black);
        painter.drawPath(seedsPath);
    }
  • 相关阅读:
    字典列表元组的推导式使用方法
    算法之排序
    闭包与装饰器
    循环(打印一些小东西)
    iOS内存小知识
    NSset
    字典
    NSNumber
    NSString
    NSArray
  • 原文地址:https://www.cnblogs.com/itrena/p/5938340.html
Copyright © 2020-2023  润新知