【Qt绘制小猪】以建造者模式绘制小猪

效果

学以致用,使用设计模式之建造者模式绘制小猪。

代码

接口:申明绘制的步骤
PigBuilder.h

cpp 复制代码
#ifndef PIGBUILDER_H
#define PIGBUILDER_H

#include <QObject>
#include <QPainter>

class PigBuilder : public QObject
{
    Q_OBJECT
public:
    explicit PigBuilder(QObject *parent = nullptr) : QObject(parent)
    {

    }
    virtual ~PigBuilder()
    {

    }
	// 绘制身体
    virtual void drawBody(QPainter &painter) = 0;
    // 绘制胳膊
    virtual void drawEars(QPainter &painter) = 0;
    // 绘制眼睛
    virtual void drawEyes(QPainter &painter) = 0;
    // 绘制鼻子
    virtual void drawNose(QPainter &painter) = 0;
    // 绘制腿
    virtual void drawLegs(QPainter &painter) = 0;
    // 绘制尾巴
    virtual void drawTail(QPainter &painter) = 0;
};

#endif // PIGBUILDER_H

实例化:实例出具体绘制的小猪
SimplePig

cpp 复制代码
#include "pigbuilder.h"


class SimplePig : public PigBuilder
{
    Q_OBJECT
public:
    explicit SimplePig(QObject *parent = nullptr) : PigBuilder(parent){

    }
    virtual ~SimplePig()
    {

    }

    virtual void drawBody(QPainter &painter)
    {
        painter.setBrush(QBrush(QColor(247, 204, 148)));
        painter.setPen(Qt::NoPen);
        painter.drawEllipse(QPointF(250, 250), 100, 120);
    }
    virtual void drawEars(QPainter &painter)
    {
        painter.setBrush(QBrush(QColor(247, 204, 148)));
        painter.setPen(Qt::NoPen);
        painter.drawEllipse(QPointF(200, 180), 40, 50);
        painter.drawEllipse(QPointF(300, 180), 40, 50);
    }
    virtual void drawEyes(QPainter &painter)
    {
        painter.setBrush(QBrush(QColor(255, 255, 255)));
        painter.setPen(Qt::NoPen);
        painter.drawEllipse(QPointF(225, 235), 15, 25);
        painter.drawEllipse(QPointF(275, 235), 15, 25);

        painter.setBrush(QBrush(QColor(0, 0, 0)));
        painter.drawEllipse(QPointF(225, 235), 8, 15);
        painter.drawEllipse(QPointF(275, 235), 8, 15);
    }
    virtual void drawNose(QPainter &painter)
    {
        painter.setBrush(QBrush(QColor(255, 185, 185)));
        painter.setPen(Qt::NoPen);
        painter.drawEllipse(QPointF(250, 270), 15, 20);
    }
    virtual void drawLegs(QPainter &painter)
    {
        painter.setBrush(QBrush(QColor(247, 204, 148)));
        painter.setPen(Qt::NoPen);
        painter.drawEllipse(QPointF(200, 320), 20, 40);
        painter.drawEllipse(QPointF(300, 320), 20, 40);
    }
    virtual void drawTail(QPainter &painter)
    {
        painter.setBrush(QBrush(QColor(247, 204, 148)));
        painter.setPen(Qt::NoPen);
        painter.drawEllipse(QPointF(320, 250), 20, 40);
    }
};

建造者:用于创建小猪
PigDirector

cpp 复制代码
class PigDirector : public QObject
{
    Q_OBJECT
public:
    explicit PigDirector(QObject *parent = nullptr) : QObject(parent)
    {
        m_pigBuilder = nullptr;
    }
    virtual ~PigDirector()
    {

    }

    void setBuilder(PigBuilder *pigBuilder)
    {
        m_pigBuilder = pigBuilder;
    }
    void draw(QPainter &painter){
        if (m_pigBuilder != nullptr)
        {
            m_pigBuilder->drawBody(painter);
            m_pigBuilder->drawEars(painter);
            m_pigBuilder->drawEyes(painter);
            m_pigBuilder->drawNose(painter);
            m_pigBuilder->drawLegs(painter);
            m_pigBuilder->drawTail(painter);
        }
    }

private:
    PigBuilder *m_pigBuilder;
};

窗体:用于显示
MainWidget

cpp 复制代码
class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        setFixedSize(500, 500);

        // 创建简单的小猪
        PigBuilder *pigBuilder = new SimplePig();
        // 设置小猪的构建方式
        m_pigDirector.setBuilder(pigBuilder);
    }
    ~MainWidget()
    {

    }

protected:
    void paintEvent(QPaintEvent *event) override
    {
        Q_UNUSED(event);

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);

        // 构建并绘制小猪
        m_pigDirector.draw(painter);
    }


private:
    PigDirector m_pigDirector;
};

调用:

cpp 复制代码
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w;
    w.show();

    return a.exec();
}
相关推荐
jing-ya16 分钟前
day 59 图论part10
java·开发语言·数据结构·算法·图论
雾隐潇湘35 分钟前
C++——第三篇 继承与多态
开发语言·c++
Marye_爱吃樱桃36 分钟前
MATLAB R2024b的安装、简单设置——保姆级教程
开发语言·matlab
旺仔.29136 分钟前
Linux系统基础详解(二)
linux·开发语言·网络
阿贵---37 分钟前
分布式系统C++实现
开发语言·c++·算法
不染尘.38 分钟前
最短路径之Bellman-Ford算法
开发语言·数据结构·c++·算法·图论
格林威38 分钟前
工业相机图像采集:Grab Timeout 设置建议——拒绝“假死”与“丢帧”的黄金法则
开发语言·人工智能·数码相机·计算机视觉·c#·机器视觉·工业相机
xiaoye-duck40 分钟前
C++ STL set 系列深度解析:从底层原理、核心接口到实战场景
开发语言·c++·stl
小涛不学习41 分钟前
Java高频面试题(带答案版)
java·开发语言
m0_6625779743 分钟前
C++中的RAII技术深入
开发语言·c++·算法