【嵌入式——QT】QPainter基本绘图

【嵌入式——QT】QPainter基本绘图

  • QPainter与QPaintDevice
  • paintEvent事件和绘图区
  • QPainter主要属性
  • QPen主要功能
  • QBrush主要功能
  • QPainter绘制基本图形方法
  • 图示
  • 代码示例

QPainter与QPaintDevice

QPainter是用来进行绘图操作的类,QPaintDevice是一个可以使用QPainter进行绘图的抽象的二维界面,QPaintEngine给QPainter提供在不同设备上绘图的接口,QPaintEngine类由QPainter和QPaintDevice内部使用,应用程序一般无需和QPaintEngine打交道,除非要创建自己的设备类型。

paintEvent事件和绘图区

QWidget类及其子类是最常用的绘图设备,从QWidget类继承的类都有paintEvent事件,要在设备上绘图,只需重定义此事件并编写相应代码。

QPainter主要属性

  • pen属性:是一个QPen对象,用于控制线条的颜色、宽度、线型等;
  • brush属性:是一个QBrush对象,用于设置一个区域的填充特性,可以设置填充颜色、填充方式、渐变特性;
  • font属性:是一个QFont对象,用于绘制文字时,设置文字的字体样式、大小等属性;

QPen主要功能

  • setColor(const QColor &color):设置画笔颜色,即线条颜色;
  • setWidth(int width):设置线条宽度;
  • setStyle(Qt::PenStyle style):设置线条样式;
  • setCapStyle(Qt::PenCapStyle style):设置线条端点样式;
  • setJoinStyle(Qt::PenJoinStyle style):设置连接方式;

QBrush主要功能

  • setColor(const QColor &color):设置画刷颜色;
  • setStyle(Qt::BrushStyle style):设置画刷样式;
  • setTexture(const QPixmap &pixmap):设置一个QPixmap类型的图片作为画刷的图片;
  • setTextureImage(const QImage &image):设置一个QImage类型的图片作为画刷的图片;

QPainter绘制基本图形方法

  • drawArc():画弧线;
  • drawChord():画一段弦;
  • drawConvexPolygon():画凸多边形;
  • drawEllipse:画椭圆;
  • drawImage():绘制图片;
  • drawLine(const QLineF &line):画直线;
  • drawLines(const QLineF *lines, int lineCount):画一批直线;
  • drawPath(const QPainterPath &path):绘制由QPainterPath对象定义的路线;
  • drawPie(const QRectF &rectangle, int startAngle, int spanAngle):绘制扇形;
  • drawPixmap(int x, int y, const QPixmap &pixmap):绘制QPixmap类型图片;
  • drawPoint(int x, int y):绘制一个点;
  • drawPoints:绘制一批点;
  • drawPolygon:绘制多边形,最后一个点和第一个点闭合;
  • drawPolyline:绘制多点连接的线,最后一个点不会和第一个点连接;
  • drawRect(int x, int y, int width, int height):画矩形;
  • drawRoundedRect:绘制圆角矩形;
  • drawText(int x, int y, const QString &text):绘制文本,只能绘制单行文字;
  • fillRect(int x, int y, int width, int height, const QBrush &brush):填充一个矩形,无边框线;
  • eraseRect:擦除某个矩形区域;
  • fillPath:填充某个QPainterPath定义的绘图路径 但是轮廓线不显示;
  • fillRect:填充一个矩形,无边框线;

图示

随便截了两张图片,代码中均有实现,不一一列举图片了。
在这里插入图片描述

在这里插入图片描述

代码示例

QPainterForm.h

#ifndef QPAINTERFORM_H
#define QPAINTERFORM_H

#include <QWidget>

namespace Ui
{
    class QPainterForm;
}

class QPainterForm : public QWidget
{
    Q_OBJECT

public:
    explicit QPainterForm(QWidget* parent = nullptr);
    ~QPainterForm();

    void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE;


    void drawArcDemo();
    void drawChordDemo();
    void drawConvexPolygonDemo();
    void drawEllipseDemo();
    void drawImageDemo();
    void drawLineDemo();
    void drawLinesDemo();
    void drawPathDemo();
    void drawPieDemo();
    void drawPixmapDemo();
    void drawPointDemo();
    void drawPointsDemo();
    void drawPolygonDemo();
    void drawPolylineDemo();
    void drawRectDemo();
    void drawRoundedRectDemo();
    void dratTextDemo();
    void eraseRectDemo();
    void fillPathDemo();
    void fillRectDemo();

    void fivePointedStar();

    void viewPortAndWindow();




private:
    Ui::QPainterForm* ui;
};

#endif // QPAINTERFORM_H

QPainterForm.cpp

#include "QPainterForm.h"
#include "ui_QPainterForm.h"
#include <QPainter>
QPainterForm::QPainterForm(QWidget* parent)
    : QWidget(parent)
    , ui(new Ui::QPainterForm)
{
    ui->setupUi(this);
    //设置窗口背景为白色
    setPalette(QPalette(Qt::white));
    setAutoFillBackground(true);
}

QPainterForm::~QPainterForm()
{
    delete ui;
}

void QPainterForm::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);
    //宽
    int w = this->width();
    //高
    int h = this->height();
    #if 0
    //中间区域矩形块
    QRect rect(w/4, h/4, w/2, h/2);
    //画笔
    QPen pen;
    pen.setWidth(3);//线宽
    pen.setColor(Qt::red);//线条红色
    pen.setStyle(Qt::DashLine);//线的样式,实线、虚线
    pen.setCapStyle(Qt::FlatCap);//线的断点样式
    pen.setJoinStyle(Qt::BevelJoin);//线的连接点样式
    painter.setPen(pen);
    //画刷
    QBrush brush;
    brush.setColor(Qt::yellow);//画刷颜色
    //Qt::BrushStyle
    brush.setStyle(Qt::CrossPattern);//画刷填充样式
    painter.setBrush(brush);
    //绘图
    painter.drawRect(rect);
    #endif
    #if 0
    QPainter painter2(this);
    /**
    QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy);
    cx xy 辐射填充的中心点,radius 是辐射填充区的半径,fx fy是焦点坐标
    **/
    QRadialGradient radialGrad(w/2, h/2, qMax(w/8, h/8), w/2, h/2);
    //0表示起点
    radialGrad.setColorAt(0, Qt::green);
    //1表示终点
    radialGrad.setColorAt(1, Qt::blue);
    radialGrad.setSpread(QGradient::ReflectSpread);
    painter2.setBrush(radialGrad);
    painter2.drawRect(this->rect());
    #endif
    // drawArcDemo();
    // drawChordDemo();
    // drawConvexPolygonDemo();
    // drawEllipseDemo();
    // drawImageDemo();
    // drawLineDemo();
    // drawLinesDemo();
    // drawPathDemo();
    // drawPieDemo();
    // drawPixmapDemo();
    // drawPointDemo();
    // drawPointsDemo();
    // drawPolygonDemo();
    // drawPolylineDemo();
    // drawRectDemo();
    // drawRoundedRectDemo();
    // dratTextDemo();
    // eraseRectDemo();
    // fillPathDemo();
    // fillRectDemo();
    // fivePointedStar();
    viewPortAndWindow();
}

void QPainterForm::drawArcDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    int startAngle = 90 * 16;
    int spanAngle = 90*16;
    QPainter painter(this);
    //画弧线
    painter.drawArc(rect, startAngle, spanAngle);
}

void QPainterForm::drawChordDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    int startAngle = 90 * 16;
    int spanAngle = 90*16;
    QPainter painter(this);
    //画一段弦
    painter.drawChord(rect, startAngle, spanAngle);
}

void QPainterForm::drawConvexPolygonDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QPoint points[4] = {QPoint(5*w/12, h/4), QPoint(3*w/4, 5*h/12), QPoint(5*w/12, 3*h/4), QPoint(w/4, 5*h/12)};
    QPainter painter(this);
    //根据给定的点画凸多边形
    painter.drawConvexPolygon(points, 4);
}

void QPainterForm::drawEllipseDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QPainter painter(this);
    //画椭圆
    painter.drawEllipse(rect);
}

void QPainterForm::drawImageDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QImage image("图片地址");
    QPainter painter(this);
    //在指定区域内绘制图片
    painter.drawImage(rect, image);
}

void QPainterForm::drawLineDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QLine line(w/4, h/4, w/2, h/2);
    QPainter painter(this);
    //画直线
    painter.drawLine(line);
}

void QPainterForm::drawLinesDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QVector<QLine> lines;
    lines.append(QLine(rect.topLeft(), rect.bottomRight()));
    lines.append(QLine(rect.topRight(), rect.bottomLeft()));
    lines.append(QLine(rect.topLeft(), rect.bottomLeft()));
    lines.append(QLine(rect.topRight(), rect.bottomRight()));
    QPainter painter(this);
    //画一批直线
    painter.drawLines(lines);
}

void QPainterForm::drawPathDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QPainterPath path;
    path.addEllipse(rect);
    path.addRect(rect);
    QPainter painter(this);
    //绘制由QPainterPath定义的路线
    painter.drawPath(path);
}

void QPainterForm::drawPieDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    int startAngle = 40*16;
    int spanAngle = 120*16;
    QPainter painter(this);
    //绘制扇形
    painter.drawPie(rect, startAngle, spanAngle);
}

void QPainterForm::drawPixmapDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QPixmap pixmap("图片地址");
    QPainter painter(this);
    //绘制QPixmap类型的图片
    painter.drawPixmap(rect, pixmap);
}

void QPainterForm::drawPointDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QPainter painter(this);
    //绘制一个点
    painter.drawPoint(QPoint(w/2, h/2));
}

void QPainterForm::drawPointsDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QPoint points[] = {QPoint(5*w/12, h/4), QPoint(3*w/4, 5*h/12), QPoint(2*w/4, 5*h/12)};
    QPainter painter(this);
    //绘制一批点
    painter.drawPoints(points, 3);
}

void QPainterForm::drawPolygonDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QPoint points[] = {QPoint(5*w/12, h/4), QPoint(3*w/4, 5*h/12), QPoint(5*w/12, 3*h/4), QPoint(2*w/4, 5*h/12)};
    QPainter painter(this);
    //绘制多边形,最后一个点和第一个点闭合
    painter.drawPolygon(points, 4);
}

void QPainterForm::drawPolylineDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QPoint points[] = {QPoint(5*w/12, h/4), QPoint(3*w/4, 5*h/12), QPoint(5*w/12, 3*h/4), QPoint(2*w/4, 5*h/12)};
    QPainter painter(this);
    //绘制多点连接的线,最后一个点不会和第一个点连接
    painter.drawPolyline(points, 4);
}

void QPainterForm::drawRectDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QPainter painter(this);
    //绘制矩形
    painter.drawRect(rect);
}

void QPainterForm::drawRoundedRectDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QPainter painter(this);
    //绘制圆角矩形
    painter.drawRoundedRect(rect, 20, 20);
}

void QPainterForm::dratTextDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QFont font;
    font.setPointSize(30);
    font.setBold(true);
    QPainter painter(this);
    painter.setFont(font);
    //绘制文本
    painter.drawText(rect, "Hello Qt");
}

void QPainterForm::eraseRectDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QPainter painter(this);
    //擦除某个矩形区域
    painter.eraseRect(rect);
}

void QPainterForm::fillPathDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QPainterPath path;
    path.addEllipse(rect);
    path.addRect(rect);
    QPainter painter(this);
    //填充某个QPainterPath定义的绘图路径 但是轮廓线不显示
    painter.fillPath(path, Qt::red);
}

void QPainterForm::fillRectDemo()
{
    //宽
    int w = this->width();
    //高
    int h = this->height();
    QRect rect(w/4, h/4, w/2, h/2);
    QPainter painter(this);
    //填充一个矩形,无边框线
    painter.fillRect(rect, Qt::green);
}
//坐标变换 五角星
void QPainterForm::fivePointedStar()
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);
    qreal r = 100;
    const qreal pi = 3.14159;
    qreal deg = pi*72/180;
    QPoint points[5]= {
        QPoint(r, 0),
        QPoint(r*std::cos(deg), -r*std::sin(deg)),
        QPoint(r*std::cos(2*deg), -r*std::sin(2*deg)),
        QPoint(r*std::cos(3*deg), -r*std::sin(3*deg)),
        QPoint(r*std::cos(4*deg), -r*std::sin(4*deg))
    };
    //设置字体
    QFont font;
    font.setPointSize(12);
    font.setBold(true);
    painter.setFont(font);
    //设置画笔
    QPen penLine;
    penLine.setWidth(2);//线宽
    penLine.setColor(Qt::blue); //线颜色
    penLine.setStyle(Qt::SolidLine); //线的类型
    penLine.setCapStyle(Qt::FlatCap);//线端点样式
    penLine.setJoinStyle(Qt::BevelJoin);//线连接点样式
    painter.setPen(penLine);
    //设置画刷
    QBrush brush;
    brush.setColor(Qt::yellow);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);
    QPainterPath starPath;
    starPath.moveTo(points[0]);
    starPath.lineTo(points[2]);
    starPath.lineTo(points[4]);
    starPath.lineTo(points[1]);
    starPath.lineTo(points[3]);
    starPath.closeSubpath();//闭合路径,最后一个点与第一个点相连
    starPath.addText(points[0], font, "0");
    starPath.addText(points[1], font, "1");
    starPath.addText(points[2], font, "2");
    starPath.addText(points[3], font, "3");
    starPath.addText(points[4], font, "4");
    //绘图
    painter.save();//保存坐标状态
    painter.translate(100, 120); //平移
    painter.drawPath(starPath);//画星星
    painter.drawText(0, 0, "S1");
    painter.restore();//恢复坐标状态
    painter.translate(300, 120); //平移
    painter.scale(0.8, 0.8); //缩放
    painter.rotate(90);//顺时针旋转90度
    painter.drawPath(starPath);
    painter.drawText(0, 0, "S2");
    painter.resetTransform();//复位所有坐标变换
    painter.translate(500, 120); //平移
    painter.rotate(-145);//逆时针旋转145度
    painter.drawPath(starPath);
    painter.drawText(0, 0, "S3");
}

//视口 窗口
void QPainterForm::viewPortAndWindow()
{
    QPainter painter(this);
    //宽
    int w = this->width();
    //高
    int h = this->height();
    int side =qMin(w, h);
    QRect rect((w-side)/2, (h-side)/2, side, side);
    painter.drawRect(rect);
    painter.setViewport(rect);//设置viewport 图案就在这个矩形框之内
    painter.setWindow(-100, -100, 200, 200);
    painter.setRenderHint(QPainter::Antialiasing);
    QPen pen;
    pen.setWidth(1);
    pen.setColor(Qt::red);
    pen.setStyle(Qt::SolidLine);
    painter.setPen(pen);
    for(int i=0; i<36; i++) {
        //画椭圆
        painter.drawEllipse(QPoint(50, 0), 50, 50);
        //顺时针旋转10度
        painter.rotate(10);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/453199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot100题解(python版69-73题)

69、有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应…

YOLOv9改进策略:注意力机制 | EMA:基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;加入EMA注意力&#xff0c;一种基于跨空间学习的高效多尺度注意力&#xff0c;效果优于ECA、CBAM、CA等经典注意力。 yolov9-c-EMA summary: 970 layers, 51011154 parameters, 51011122 gradients, 238.9 GF…

链动2+1模式与用户留存复购策略:结合消费增值模式的创新应用

大家好&#xff0c;我是吴军&#xff0c;来自一家软件开发公司的产品经理岗位。 今天&#xff0c;我想和大家深入探讨链动21模式&#xff0c;特别是它如何有效应对用户留存和复购的挑战。 尽管有些人认为链动模式已经过时&#xff0c;但我认为它的潜力远未被充分挖掘。链动不仅…

SpringBoot3整合mybatis

SpringBoot3整合mybatis 一、添加mybatis的依赖二、通过XML配置三、通过yum或properties文件配置四、常用注解1.Mapper2.MapperScan 一、添加mybatis的依赖 <!--mybatis--> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>…

源聚达科技:抖音今年开店有没有什么新政策

随着电商行业的蓬勃发展&#xff0c;抖音平台作为新兴的社交电商平台&#xff0c;近年来推出了多项新政策以吸引商家入驻&#xff0c;提升用户体验。今年&#xff0c;抖音在开店政策上又有了新的调整和优化&#xff0c;这些变化对于商家来说无疑是重要的风向标。 最新的政策中&…

北京银行助力首批消费类公募REITs成功上市 担任嘉实物美消费REIT托监管行

3月12日&#xff0c;由北京银行担任托监管行并参与战配投资的嘉实物美消费REIT在上交所成功上市。这也让北京银行成为全国首家担任公募REITs托监管银行的城商行&#xff0c;亦是首家参与首批消费基础设施公募REITs战略投资的城商行&#xff0c;成功跻身商业银行综合服务公募REI…

05-ESP32-S3-IDF USART

ESP32-S3 IDF USART详解 USART简介 USART是一种串行通信协议&#xff0c;广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式&#xff0c;因此它可以在没有时钟信号的情况下&#xff08;异步模式&#xff09;或有时钟信号的情况下&#xff08;同步模式&#xff…

Java项目:48 ssm008医院门诊挂号系统+jsp(含文档)

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本选题则旨在通过标签分类管理等方式实现 管理员&#xff1b;个人中心、药房管理、护士管理、医生管理、病人信息管理、科室信息管理、挂号管理、诊断…

如何解决word字体大小显示不一,部分文字无法显示/显式为空白?

问题重现 今天重启后打开word&#xff0c;显示如下&#xff1a; 从第1张图看&#xff0c;字体显示大小不同&#xff0c;第2张图&#xff0c;敲“满分”&#xff0c;无法显示“满”字&#xff0c;而且“分”的大小比一般字体要大。 我的解决方案 – 修复office 采用GPT的建议…

移除元素

文章目录 移除元素删除有序数组中的重复项移动零比较含退格的字符串有序数组的平方 移除元素 双指针 删除指定项且不改变顺序 def removeElement(nums: list[int], val: int) -> int:fast slow 0while fast < len(nums):if nums[fast] ! val:nums[slow] nums[fast]sl…

GEE:将数据设置为任何人可读

一些 Google Earth Engine(GEE) 平台的初学者在分享代码的时候&#xff0c;往往不会对代码中的数据设置成任何人可读。这会导致别人打开代码的时候无法正常运行代码&#xff0c;也就无法帮助你修改和调试代码。针对这个问题&#xff0c;本文记录了对 Assets 和 Imports 中的数据…

24年英语四六级报名,注意这5点否则报名失败

多地3月中旬后开始四六级报名&#xff0c;报名前注意这5点&#xff0c;否则报名失败&#xff01; 1、四六级名额有限?报名需要抢&#xff0c;没有抢到的考生可以提交“候补报名”&#xff0c;还有报名机会 2、有的学校则规定六级考到500分则不能再刷分。 3、很多大学的报名…

Tcl语言:基础入门(三)

相关阅读 Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm1001.2014.3001.5482 Tcl中的大括号 大括号{}可以使得被其包围的所有内容被解释为字面量&#xff0c;所以不会进行命令替换&#xff0c;转义符替换&#xff08;大部分情况的转义&#xff0…

视频监控管理系统EasyCVR平台设备增删改操作不生效是什么原因?

国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xf…

气膜建筑是由什么材料制成的?PVDF膜材的革新应用值得期待吗?

随着科技的不断进步和发展&#xff0c;建筑行业也在不断涌现新型的建筑材料。气膜建筑作为其中一种创新的建筑膜材&#xff0c;在体育馆、运动场馆、展览厅等场所得到了广泛的应用。那么&#xff0c;究竟是什么材料构成了气膜建筑呢&#xff1f;轻空间小编将为您详细介绍。 气膜…

ELF技术贴|如何在开发板上实现对Java的支持

Java作为一种功能强大且广泛应用的编程语言&#xff0c;具有广泛的适应性和实用性。在ELF 1开发板上集成Java支持&#xff0c;无疑将赋予嵌入式开发者更广阔的选择空间&#xff0c;今天就为各位小伙伴详细解析如何在ELF 1开发板上成功部署和运行Java环境。 1.拷贝两个压缩包到E…

Caffeine本地缓存快速上手教程,通俗易懂

1. 概述 使用缓存的优点是可以减少直接访问数据库的压力。Caffeine是目前单机版缓存性能最高的&#xff0c;提供了最优的缓存命中率。用法和java中的map集合比较类似&#xff0c;底层使用一个ConcurrencyHashMap来保存所有数据&#xff0c;可以理解为一个增强版的map集合&…

基于SpringBoot的“留守儿童爱心网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“留守儿童爱心网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 宣传新闻界面图 志愿活动界面…

基于Spring Boot的校园管理系统 ,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1767745870094217218

立式学习灯有什么讲究?大路灯原来要这样选,五大台灯分享!

立式学习灯作为近年来最适合照明的护眼家电&#xff0c;为用户提供了良好的光线环境&#xff0c;并且还能够减少光线带来的视觉疲劳感。然而&#xff0c;随着其销量的节节攀升商家为了谋取利润&#xff0c;市面上也涌现了很多劣质产品&#xff0c;这些产品普遍没有经过技术调教…