绘画系统(102):【例】太极图


在这里插入图片描述

main.cpp

#include "widget.h"
#include <QtWidgets>

int main(int argc, char *argv[])
{
#if (QT_VERSION <= QT_VERSION_CHECK(6, 0, 0))
    QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

Widget类

Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QPainterPath>
#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    QSize sizeHint() const override;

    // QWidget interface
protected:
    void paintEvent(QPaintEvent *event) override;

protected:
    void setSize( );
public:
    QTimer *m_timer;
    int m_rotate = 0;
    QPainterPath leftpath,rightpath;
    QPainterPath lefthalfCircle , righthalfCircle;
    QPainterPath rightRect,leftRect;
    QPainterPath inner1,inner2;
    QPainterPath inner11,inner12;
    qreal size,R,r,core;
};
#endif // WIDGET_H

Widget.cpp

#include "widget.h"

#include <QtWidgets>

#define qout if( 1 ) qDebug() << __FUNCTION__ << __LINE__ << ": "

QRectF static makeRectFromCentXY(qreal cx,qreal cy,qreal radius){
    return QRectF(cx-radius,cy-radius,radius*2,radius*2);
}

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    m_timer = new QTimer(this);
    connect(m_timer,&QTimer::timeout,[this]{
        m_rotate += 12;
        m_rotate %= 360;
        update();
    });
    m_timer->start(1000/30);
}

Widget::~Widget()
{
}

void Widget::paintEvent(QPaintEvent * event)
{
    QPainter painter(this);
    painter.fillRect(0,0,width(),height(),Qt::GlobalColor::lightGray);

    painter.setRenderHint(QPainter::Antialiasing);

    setSize();

    int originX = width() /2;
    int originY = height()/2;
    painter.translate(originX, originY);

    leftpath .translate(-R,-R);
    rightpath.translate(-R,-R);

    inner1.translate(-R, -R);
    inner2.translate(-R, -R);
    inner11.translate(-R, -R);
    inner12.translate(-R, -R);

    painter.rotate(m_rotate);


    painter.fillPath(leftpath,  Qt::white);
    painter.fillPath(rightpath, Qt::black);

    painter.fillPath(inner11,  Qt::black );
    painter.fillPath(inner12,  Qt::white );

    return QWidget::paintEvent(event);
}

void Widget::setSize()
{
    size = qMin(width(),height());

    size *= 0.8;
    R = size/2;
    r = R/2;

    // 清空 path
    circle.clear();
    leftRect.clear();
    rightRect.clear();
    leftpath.clear();
    rightpath.clear();
    inner1.clear();
    inner2.clear();
    inner11.clear();
    inner12.clear();

    // 大圆
    circle.addEllipse(0,0,size,size);

    // 左边的路径 = 圆 - 右矩形
    rightRect.addRect(R,0,R,size);
    leftpath = circle - rightRect ;

    // 右边的路径 = 圆 - 左矩形
    leftRect.addRect(0,0,R,size);
    rightpath = circle - leftRect ;

    // 阴阳鱼头部的圆
    inner1.addEllipse( makeRectFromCentXY(R, r,   r) );
    inner2.addEllipse( makeRectFromCentXY(R, r+R, r) );

    // 半圆+头部的圆合并
    leftpath  += inner1;
    rightpath += inner2;

    // 右边的路径去除掉另一条鱼的头部区域
    rightpath -= inner1;
    leftpath  -= inner2;

    // 鱼眼
    core = r/3;
    inner11.addEllipse( makeRectFromCentXY(R,r,core) );
    inner12.addEllipse( makeRectFromCentXY(R,R+r,core) );
}


QSize Widget::sizeHint() const
{
    return QSize(300,300);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值