博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
32 Qt 之绘图之绘制一个漂亮的西瓜
阅读量:2194 次
发布时间:2019-05-02

本文共 2094 字,大约阅读时间需要 6 分钟。

简笔画

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

绘制

效果

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

源码

主要分为以下三部:

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

注意:绘制西瓜子的时候,由于西瓜子随机分布在西瓜中,所以我们使用了随机数来表示区域,并判断西瓜子是否在内圆中(西瓜子肯定要在西瓜内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);}

 

转载地址:http://vgsub.baihongyu.com/

你可能感兴趣的文章
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
win10将IE11兼容ie10
查看>>
checkbox设置字体颜色
查看>>
第一篇 HelloWorld.java重新学起
查看>>
ORACLE表空间扩张
查看>>
orcal 循环执行sql
查看>>
web.xml配置监听器,加载数据库信息配置文件ServletContextListener
查看>>
结构型模式之桥接模式(Bridge)
查看>>
行为型模式之状态模式(State)
查看>>
行为型模式之策略模式(Strategy)
查看>>
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>