【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();
}
相关推荐
希望永不加班13 分钟前
Java数据类型陷阱:int和Integer的7个关键区别
java·开发语言
The Chosen One98517 分钟前
【Linux】深入理解Linux进程(二):进程的状态
linux·运维·服务器·开发语言·git
嵌入式小杰33 分钟前
一阶低通滤波入门教程:从原理到单片机 C 代码实现
c语言·开发语言·stm32·单片机·算法
叼烟扛炮41 分钟前
C++ 知识点02 输入输出
开发语言·c++·算法·输入输出
qcx2343 分钟前
深度解析Deepseek V4:1M 上下文不是军备竞赛,是养 Agent 的人才知道的痛
java·开发语言
小此方1 小时前
Re:思考·重建·记录 现代C++ C++11篇(六) 从 shared_ptr 到 weak_ptr:起底智能指针的引用计数与循环引用之痛
开发语言·c++·c++11·现代c++
晨非辰1 小时前
吃透C++两大默认成员函数:const成员函数、 & 取地址运算符重载
java·大数据·开发语言·c++·人工智能·后端·面试
我滴老baby1 小时前
多智能体协作系统设计当AI学会团队合作效率翻十倍
android·开发语言·人工智能
落雪寒窗-1 小时前
Python进阶核心路线(工程向)
开发语言·python
humcomm1 小时前
全栈开发技术栈的最新进展(2026年视角)
开发语言·架构