【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();
}
相关推荐
AI+程序员在路上41 分钟前
Qt6中模态与非模态对话框区别
开发语言·c++·qt
nbsaas-boot6 小时前
Java 正则表达式白皮书:语法详解、工程实践与常用表达式库
开发语言·python·mysql
chao_7896 小时前
二分查找篇——搜索旋转排序数组【LeetCode】两次二分查找
开发语言·数据结构·python·算法·leetcode
风无雨6 小时前
GO 启动 简单服务
开发语言·后端·golang
斯普信专业组6 小时前
Go语言包管理完全指南:从基础到最佳实践
开发语言·后端·golang
哈市雪花8 小时前
相机:以鼠标点为中心缩放(使用OpenGL+QT开发三维CAD)
qt·相机·opengl·cad·缩放·工业软件·渲染效果
我是苏苏8 小时前
C#基础:Winform桌面开发中窗体之间的数据传递
开发语言·c#
斐波娜娜8 小时前
Maven详解
java·开发语言·maven
小码氓8 小时前
Java填充Word模板
java·开发语言·spring·word
暮鹤筠9 小时前
[C语言初阶]操作符
c语言·开发语言