QT绘图项目 - 汽车表盘

目录

前言:

整体代码

widget.h

widget.cpp

效果演示

实现刻度文字正确排版

优化代码

达到效果

封装整理代码结构:

widget.h

widget.cpp

指针样式美化

 优化后的指针API

效果演示

设置高速刻度为红色

 优化刻度API

效果演示

速度显示优化

给内圈画上黑色

优化速度显示文本格式

调整绘画顺序

效果演示

实现内环发光圈:

内环发光效果API

插入位置

效果演示

实现外环发个圈

外环发光效果API

插入位置

实现效果

绘制汽车logo

绘制汽车logo的API

插入位置

实现效果

deBug及微调

bug1: restore()和 save() 没有配对使用

bug2:中间显示的速度不匹配


前言:

 这个表盘在上一个项目"简易表盘"的基础上搭建,请先看上篇:

Qt绘图项目 - 简易表盘-CSDN博客

整体代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

protected:
   void paintEvent(QPaintEvent *event);

private:
    Ui::Widget *ui;
    QTimer *timer;
    int currentValue; //实现指针移动
    int mark = 0; // 控制指针的移动方向
    int startAbgle; // 设置起始角度
    double angle;
    void initCanvas(QPainter& painter);
    void drawMiddleCircle(QPainter& painter,int radius);
    void drawCurrentSpeed(QPainter& painter);
    void drawScale(QPainter& painter,int radius);
    void drawScaleText(QPainter& painter,int radius);
    void drawPointLine(QPainter &painter,int length);
    void drawSpeedPie(QPainter& painter,int radius);
    void startSpeed();
    void drawEllispseInnerBlack(QPainter& painter,int radius);
    void drawEllispseInnerBShine(QPainter& painter,int radius);
    void drawEllispseOutterBShine(QPainter& painter,int radius);
    void drawLogo(QPainter& painter,int radius);
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QPainter>
#include <QTimer>
#include <QtMath>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setFixedSize(800,600);
    startAbgle = 150; // 设置起始角度为150
    startSpeed();


}

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

void Widget::initCanvas(QPainter& painter)
{
    //设置抗锯齿
    painter.setRenderHints(QPainter::Antialiasing,true);
    //设置黑色的背景色
    painter.setBrush(Qt::black); // 设置 黑色的画刷
    painter.drawRect(rect());

    //坐标系,平移到中心
    QPoint cent(rect().width()/2,rect().height()*0.6); //自定义中心位置
    painter.translate(cent);

}

void Widget::drawMiddleCircle(QPainter &painter,int radius)
{
    //画小圆
    painter.setPen(QPen(Qt::white,4)); //设置白色的画笔
    painter.drawEllipse(QPoint(0,0),60,60);
}

//画当前速度
void Widget::drawCurrentSpeed(QPainter &painter)
{
    painter.setPen(Qt::white);
    //显示当前速度值:
    QFont font("Arial",30);
    font.setBold(true);
    painter.setFont(font);
    painter.drawText(QRect(-60,-60,120,70),Qt::AlignCenter,QString::number(currentValue*4));

    QFont font2("Arial",13);
    font2.setBold(true);
    painter.setFont(font2);
    painter.drawText(QRect(-60,-60,120,160),Qt::AlignCenter,"Km/h");

}

// 画出当前刻度
void Widget::drawScale(QPainter &painter,int radius)
{
    //保存原点:
    painter.save(); // 三点钟方向
    //画刻度:

    //1.算出一个刻度需要的角度 270 度分成 50份
    angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差
    //2.设置起始角度
    painter.rotate(startAbgle); // 从135度开始
    //设置字体样式:
    // painter.setFont(QFont("华文宋体",8));
    //3.分类讨论 画出所有刻度
    for(int i=0;i<=60;++i){//包括0-  一共有61根刻度线
        if(i>=40){  // 时速160 = 40*4 认定为高速
            painter.setPen(QPen(Qt::red,5)); //将高速速设定为红色
        }

        if(i%5 == 0){ // 被5 整除进一步细分表盘
            //画出一个长刻度
            painter.drawLine(radius-20,0,radius-3,0);
        }
        else{
            //画出一个长刻度
            painter.drawLine(radius-10,0,radius-3,0);
        }
        painter.rotate(angle);//选择angle的角度准备去画下一个刻度
    }
    painter.restore();
}

// 写刻度文字
void Widget::drawScaleText(QPainter &painter, int radius)
{
    //设置字体:

    QFont font("Arial",13);
    font.setBold(true); // 设置粗体
    painter.setFont(font);
    int r = radius-43;

    for(int i=0;i<=60;++i){
        if(i%5 == 0){ // 每5格标记一个刻度
            //保存坐标系
            painter.save();
            //算出平移点  // 弧度 = 角度*3.1415/180
            int delX =  qCos(qDegreesToRadians(210-angle*i))*r;//QT中sin、cos认的是弧度
            int delY =  qSin(qDegreesToRadians(210-angle*i))*r;//qDegreesToRadians - 角度转弧度

            //平移坐标系
            painter.translate(QPoint(delX,-delY));
            //旋转坐标系:
            painter.rotate(-120+angle*i);//angle=4,30*4=120,实参是0,120
            //写上文字
            painter.drawText(-25,-25,50,30,Qt::AlignCenter,QString::number(i*4));
            //恢复坐标系
            painter.restore();
        }
    }

}

// 画指针
void Widget::drawPointLine(QPainter &painter,int length)
{
    //画指针 --> 线
    //先恢复到之前保存的原点:

    painter.save(); // 接着保存原点
    // 通过定时器去改变currentValue的值,去控制指针的移动
    // painter.drawLine(60,0,height()/2-20-38,0); // 58

    //指针样式美化:

    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.setBrush(Qt::white);
    painter.setPen(Qt::NoPen);
    //painter.translate(rect().center());
    static const QPointF points[4] = {
        QPointF(0,0),
        QPointF(0,15.0),
        QPointF(220.0,1.1),
        QPointF(220.0,-1.1)
    };

    //给指针弧度偏移 --> 让指针转动起来
    painter.rotate(startAbgle+angle*currentValue); // 进行坐标系偏移
    painter.drawPolygon(points, 4);
    painter.restore();
}

//画扇形
void Widget::drawSpeedPie(QPainter &painter, int radius)
{

    QRect rentangle(-radius,-radius,radius*2,radius*2);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255,0,0,80));

    painter.drawPie(rentangle,(-startAbgle)*16,-angle*currentValue*16);
}

void Widget::startSpeed()
{
    timer = new QTimer(this);
    currentValue = 0;
    connect(timer,&QTimer::timeout,[=](){
        if(mark == 0){
            currentValue++;
            if(currentValue >= 60)
                mark = 1;
        }
        else if(mark ==1){
            currentValue--;
            if(currentValue <= 0)
                mark = 0;
        }
        update(); // 触发绘图事件
    });
    timer->start(30);
}

// ,给内圈画上黑色
void Widget::drawEllispseInnerBlack(QPainter &painter, int radius)
{
    painter.setBrush(Qt::black);
    painter.drawEllipse(QPoint(0,0),radius,radius);
}

// 内环发光效果
void Widget::drawEllispseInnerBShine(QPainter &painter, int radius)
{
    // 径向 渐变实现
    QRadialGradient radialGradient(0,0,radius);
    radialGradient.setColorAt(0.0,QColor(255,0,0,200));
    radialGradient.setColorAt(1.0,QColor(0,0,0,100));
    painter.setBrush(radialGradient);
    painter.drawEllipse(QPoint(0,0),radius,radius);
}

// 画外围发光圈
void Widget::drawEllispseOutterBShine(QPainter &painter, int radius)
{

    QRect rentangle(-radius,-radius,radius*2,radius*2);
    painter.setPen(Qt::NoPen);
    //渐变色处理外环光亮
    QRadialGradient radialGradient(0,0,radius);
    radialGradient.setColorAt(1,QColor(255,0,0,200));
    radialGradient.setColorAt(0.97,QColor(255,0,0,120));
    radialGradient.setColorAt(0.9,QColor(0,0,0,0));
    radialGradient.setColorAt(0,QColor(0,0,0,0));
    painter.setBrush(radialGradient);

    painter.drawPie(rentangle,(-150)*16,-angle*60*16);
}

// 绘制汽车logo
void Widget::drawLogo(QPainter &painter, int radius)
{
 QRect rectangle(-65,radius*0.38,130,50);
 painter.drawPixmap(rectangle,QPixmap(":/C:/Users/31472/Desktop/Images/qi_che_biao_pan/lu_hua.png"));

}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    int rad = height()/2;
    // 初始化画布
    initCanvas(painter);

    //不用画大圆了,用刻度尺去表出框架即可
    //painter.drawEllipse(QPoint(0,0),height()/2,height()/2);

    //画出中间的小圆
    drawMiddleCircle(painter,60);

    //画刻度
    drawScale(painter,rad);

    //写刻度文字:
    drawScaleText(painter,rad);
    // 画指针
    drawPointLine(painter,rad-58);
    //画扇形
    drawSpeedPie(painter,rad);
    //画渐变色发光内圈圆
    drawEllispseInnerBShine(painter,110);
    // 画黑色内圈
    drawEllispseInnerBlack(painter,80);
    //画出当前速度 -- 放正在画黑的下面,要设置在黑圈的图层下
    drawCurrentSpeed(painter);
    //画外环发光圈
    drawEllispseOutterBShine(painter,rad+15);
    //画汽车logo
    drawLogo(painter,rad);

}

效果演示

实现刻度文字正确排版

 移动坐标系,达到正确排版

优化代码

//刻度文字达到正确排版效果

    int r = height()/2-43;
    painter.restore();
    for(int i=0;i<=60;++i){
        if(i%5 == 0){ // 每5格标记一个刻度
        //保存坐标系
        painter.save();
        //算出平移点  // 弧度 = 角度*3.1415/180
        int delX =  qCos(qDegreesToRadians(210-angle*i))*r;//QT中sin、cos认的是弧度
        int delY =  qSin(qDegreesToRadians(210-angle*i))*r;//qDegreesToRadians - 角度转弧度

        //平移坐标系
        painter.translate(QPoint(delX,-delY));
        //旋转坐标系:
        painter.rotate(-120+angle*i);//angle=4,30*4=120,实参是0,120
        //写上文字
        painter.drawText(-25,-25,50,30,Qt::AlignCenter,QString::number(i*4));
        //恢复坐标系
        painter.restore();
        }
    }

达到效果

封装整理代码结构:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

protected:
   void paintEvent(QPaintEvent *event);

private:
    Ui::Widget *ui;
    QTimer *timer;
    int currentValue; //实现指针移动
    int mark = 0; // 控制指针的移动方向
    int startAbgle; // 设置起始角度
    double angle;
    void initCanvas(QPainter& painter);
    void drawMiddleCircle(QPainter& painter,int radius);
    void drawCurrentSpeed(QPainter& painter);
    void drawScale(QPainter& painter,int radius);
    void drawScaleText(QPainter& painter,int radius);
    void drawPointLine(QPainter &painter,int length);
    void drawSpeedPie(QPainter& painter,int radius);
    void startSpeed();
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QPainter>
#include <QTimer>
#include <QtMath>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    startAbgle = 150; // 设置起始角度为150
    startSpeed();


}

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

void Widget::initCanvas(QPainter& painter)
{
    //设置抗锯齿
    painter.setRenderHints(QPainter::Antialiasing,true);
    //设置黑色的背景色
    painter.setBrush(Qt::black); // 设置 黑色的画刷
    painter.drawRect(rect());

    //坐标系,平移到中心
    painter.translate(rect().center());

}

void Widget::drawMiddleCircle(QPainter &painter,int radius)
{
    //画小圆
    painter.setPen(QPen(Qt::white,4)); //设置白色的画笔
    painter.drawEllipse(QPoint(0,0),60,60);
}

//画当前速度
void Widget::drawCurrentSpeed(QPainter &painter)
{
    //显示当前速度值:
    painter.setFont(QFont("华文宋体",15));
    painter.drawText(QRect(-60,-60,120,120),Qt::AlignCenter,QString::number(currentValue));

}

// 画出当前刻度
void Widget::drawScale(QPainter &painter,int radius)
{
    //保存原点:
    painter.save(); // 三点钟方向
    //画刻度:

    //1.算出一个刻度需要的角度 270 度分成 50份
    angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差
    //2.设置起始角度
    painter.rotate(startAbgle); // 从135度开始
    //设置字体样式:
   // painter.setFont(QFont("华文宋体",8));
    //3.分类讨论 画出所有刻度
    for(int i=0;i<=60;++i){//包括0-  一共有61根刻度线
        if(i%5 == 0){ // 被5 整除进一步细分表盘
            //画出一个长刻度
            painter.drawLine(radius-20,0,radius-3,0);
        }
        else{
            //画出一个长刻度
            painter.drawLine(radius-10,0,radius-3,0);
        }
        painter.rotate(angle);//选择angle的角度准备去画下一个刻度
    }

}

// 写刻度文字
void Widget::drawScaleText(QPainter &painter, int radius)
{
    int r = radius-43;
    painter.restore();
    for(int i=0;i<=60;++i){
        if(i%5 == 0){ // 每5格标记一个刻度
        //保存坐标系
        painter.save();
        //算出平移点  // 弧度 = 角度*3.1415/180
        int delX =  qCos(qDegreesToRadians(210-angle*i))*r;//QT中sin、cos认的是弧度
        int delY =  qSin(qDegreesToRadians(210-angle*i))*r;//qDegreesToRadians - 角度转弧度

        //平移坐标系
        painter.translate(QPoint(delX,-delY));
        //旋转坐标系:
        painter.rotate(-120+angle*i);//angle=4,30*4=120,实参是0,120
        //写上文字
        painter.drawText(-25,-25,50,30,Qt::AlignCenter,QString::number(i*4));
        //恢复坐标系
        painter.restore();
        }
    }

}

// 画指针
void Widget::drawPointLine(QPainter &painter,int length)
{
    //画指针 --> 线
    //先恢复到之前保存的原点:
    painter.restore();
    painter.save(); // 接着保存原点
    // 通过定时器去改变currentValue的值,去控制指针的移动
    painter.rotate(startAbgle+angle*currentValue); // 进行坐标系偏移
    painter.drawLine(60,0,height()/2-20-38,0); // 58
}

//画扇形
void Widget::drawSpeedPie(QPainter &painter, int radius)
{
    painter.restore();
    QRect rentangle(-radius,-radius,radius*2,radius*2);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255,128,64,150));

    painter.drawPie(rentangle,(-startAbgle)*16,-angle*currentValue*16);
}

void Widget::startSpeed()
{
    timer = new QTimer(this);
    currentValue = 0;
    connect(timer,&QTimer::timeout,[=](){
        if(mark == 0){
            currentValue++;
            if(currentValue >= 60)
                mark = 1;
        }
        else if(mark ==1){
            currentValue--;
            if(currentValue <= 0)
                mark = 0;
        }


        update(); // 触发绘图事件
    });
    timer->start(30);
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    // 初始化画布
    initCanvas(painter);

    //不用画大圆了,用刻度尺去表出框架即可
    //painter.drawEllipse(QPoint(0,0),height()/2,height()/2);

    //画出中间的小圆
    drawMiddleCircle(painter,60);
    //画出当前速度
    drawCurrentSpeed(painter);
    //画刻度
    drawScale(painter,height()/2);

    //写刻度文字:
    drawScaleText(painter,height()/2);
    // 画指针
    drawPointLine(painter,height()/2-58);


    //画扇形
    drawSpeedPie(painter,height()/2);

}

指针样式美化

 优化后的指针API

// 画指针
void Widget::drawPointLine(QPainter &painter,int length)
{
    //画指针 --> 线
    //先恢复到之前保存的原点:
    painter.restore();
    painter.save(); // 接着保存原点
    // 通过定时器去改变currentValue的值,去控制指针的移动
     // painter.drawLine(60,0,height()/2-20-38,0); // 58


    //指针样式美化:

    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.setBrush(Qt::white);
    painter.setPen(Qt::NoPen);
    //painter.translate(rect().center());
    static const QPointF points[4] = {
        QPointF(0,0),
        QPointF(0,15.0),
        QPointF(220.0,1.1),
        QPointF(220.0,-1.1)

    };

    //给指针弧度偏移 --> 让指针转动起来
    painter.rotate(startAbgle+angle*currentValue); // 进行坐标系偏移
    painter.drawPolygon(points, 4);

}

效果演示

可以看到我们投票通过画多边形的方式对指针进行了美化

设置高速刻度为红色

 优化刻度API

void Widget::drawScale(QPainter &painter,int radius)
{
    //保存原点:
    painter.save(); // 三点钟方向
    //画刻度:

    //1.算出一个刻度需要的角度 270 度分成 50份
    angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差
    //2.设置起始角度
    painter.rotate(startAbgle); // 从135度开始
    //设置字体样式:
   // painter.setFont(QFont("华文宋体",8));
    //3.分类讨论 画出所有刻度
    for(int i=0;i<=60;++i){//包括0-  一共有61根刻度线
        if(i>=40){  // 时速160 = 40*4 认定为高速
         painter.setPen(QPen(Qt::red,5)); //将高速速设定为红色
        }

        if(i%5 == 0){ // 被5 整除进一步细分表盘
            //画出一个长刻度
            painter.drawLine(radius-20,0,radius-3,0);
        }
        else{
            //画出一个长刻度
            painter.drawLine(radius-10,0,radius-3,0);
        }
        painter.rotate(angle);//选择angle的角度准备去画下一个刻度
    }

}

效果演示

//注意我这里设置了字体格式:

    QFont font("Arial",13);
    font.setBold(true); // 设置粗体
    painter.setFont(font);

速度显示优化

给内圈画上黑色

void Widget::drawEllispseInnerBlack(QPainter &painter, int radius)
{
  painter.setBrush(Qt::black);
  painter.drawEllipse(QPoint(0,0),radius,radius);
}

优化速度显示文本格式

//画当前速度
void Widget::drawCurrentSpeed(QPainter &painter)
{
    painter.setPen(Qt::white);
    //显示当前速度值:
    QFont font("Arial",30);
    font.setBold(true);
    painter.setFont(font);
    painter.drawText(QRect(-60,-60,120,70),Qt::AlignCenter,QString::number(currentValue));

    QFont font2("Arial",13);
    font2.setBold(true);
    painter.setFont(font2);
    painter.drawText(QRect(-60,-60,120,160),Qt::AlignCenter,"Km/h");

}

调整绘画顺序

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    // 初始化画布
    initCanvas(painter);

    //不用画大圆了,用刻度尺去表出框架即可
    //painter.drawEllipse(QPoint(0,0),height()/2,height()/2);

    //画出中间的小圆
    drawMiddleCircle(painter,60);

    //画刻度
    drawScale(painter,height()/2);

    //写刻度文字:
    drawScaleText(painter,height()/2);
    // 画指针
    drawPointLine(painter,height()/2-58);

    //画扇形
    drawSpeedPie(painter,height()/2);
    // 画黑色内圈
    drawEllispseInnerBlack(painter,80);
    //画出当前速度 -- 放正在画黑的下面,要设置在黑圈的图层下
    drawCurrentSpeed(painter);

}

效果演示

实现内环发光圈:

内环发光效果API

void Widget::drawEllispseInnerBShine(QPainter &painter, int radius)
{
    // 径向 渐变实现
    QRadialGradient radialGradient(0,0,radius);
    radialGradient.setColorAt(0.0,QColor(255,0,0,200));
    radialGradient.setColorAt(1.0,QColor(0,0,0,100));
    painter.setBrush(radialGradient);
    painter.drawEllipse(QPoint(0,0),radius,radius);
}

插入位置

效果演示

实现外环发个圈

外环发光效果API

// 画外围发光圈
void Widget::drawEllispseOutterBShine(QPainter &painter, int radius)
{
    painter.restore();
    QRect rentangle(-radius,-radius,radius*2,radius*2);
    painter.setPen(Qt::NoPen);
    //渐变色处理外环光亮
    QRadialGradient radialGradient(0,0,radius);
    radialGradient.setColorAt(1,QColor(255,0,0,200));
    radialGradient.setColorAt(0.97,QColor(255,0,0,120));
    radialGradient.setColorAt(0.9,QColor(0,0,0,0));
    radialGradient.setColorAt(0,QColor(0,0,0,0));
    painter.setBrush(radialGradient);

    painter.drawPie(rentangle,(-150)*16,-angle*60*16);
}

插入位置

实现效果

绘制汽车logo的API

//需要先添加资源文件

void Widget::drawLogo(QPainter &painter, int radius)
{
 QRect rectangle(-65,radius*0.38,130,50);
 painter.drawPixmap(rectangle,QPixmap(":/C:/Users/31472/Desktop/Images/qi_che_biao_pan/lu_hua.png"));

}

插入位置

实现效果

deBug及微调

bug1: restore()和 save() 没有配对使用

处理手段: 把多余的restore()去掉

bug2:中间显示的速度不匹配

处理:

这样修改后得到的速度就是实际值

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

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

相关文章

【学习-华为HCIA数通网络工程师真题(持续更新)】(2024-6-16更)

1、在 VRP 平台上&#xff0c;可以通过下面哪种方式访向上条历史命令&#xff1f; 上光标 &#xff08;ctrlU 为自定义快捷键&#xff0c;ctrlP 为显示历史缓存区的前一条命令&#xff0c;左光标为移动光标&#xff09; 2、主机 A &#xff08;10.1.1.2/24&#xff09;和主机 B…

在亚马逊云上部署WordPress:一个完整的LAMP环境安装教程

什么是LAMP LAMP是一个流行的开源软件堆栈&#xff0c;用于网站和网络应用程序的开发和部署。LAMP是几个主要组件的首字母缩写&#xff0c;包括&#xff1a; Linux&#xff1a;操作系统层&#xff0c;LAMP通常部署在Linux操作系统上&#xff0c;但它也可以使用其他类似Unix的…

Golang | Leetcode Golang题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; type MinStack struct {stack []intminStack []int }func Constructor() MinStack {return MinStack{stack: []int{},minStack: []int{math.MaxInt64},} }func (this *MinStack) Push(x int) {this.stack append(this.stack, x)top : thi…

牛客周赛 Round 47 解题报告 | 珂学家

前言 题解 这真的是牛客周赛&#xff1f; 哭了 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红的葫芦 签到题 但是写起来有点变扭&#xff0c;方法应该蛮多的 统计分组 有2组一组长度为2&#xff0c;一组长度为3 def check(arr):arr.sort()if arr[0] …

Git学习2 -- VSCode中的Git

看了下&#xff0c;主要的插件有3个。自带的Source Control。第1个是Gitlens&#xff0c;第2个是Git Graph。第三个还有个git history。 首先是Source Control。界面大概是这样的。 还是挺直观的。在第一栏source control&#xff0c;可以进行基本的git操作。主要的git操作都是…

MongoDB~高可用集群介绍:复制集群(副本集)、分片集群

背景 MongoDB 的集群主要包括副本集&#xff08;Replica Set&#xff09;和分片集群&#xff08;Sharded Cluster&#xff09;两种类型。 副本集 组成&#xff1a;通常由一个主节点&#xff08;Primary&#xff09;和多个从节点&#xff08;Secondary&#xff09;构成。 功…

Objective-C 学习笔记 | init

Objective-C 学习笔记 | init Objective-C 学习笔记 | init编写 init 方法禁用 init 方法 Objective-C 学习笔记 | init init 是实例方法&#xff0c;负责初始化对象&#xff0c;并返回初始化后的对象的地址。 编写 init 方法 完整代码见于&#xff1a;UestcXiye/Objective-…

【前端:HTML+CSS+JavaScript】HTML基础(下)

一、表格标签 1.1 表格的主要作用 表格主要用于显示、展示数据。因为她可以让数据显示的非常频繁&#xff0c;可读性非常好。特别是后台展示数据的时候&#xff0c;能够熟练运用表格就线程显得很重要。表格不是用来布局页面的。而是用来展示数据的。 1.2 表格的基本语法 <…

windows11 x64 23H2 企业纯净版2024.6.16

闲来无事试安装了下da_nao_yan的 【6月12日更新】Windows11 22631.3737企业版 23H2 自用优化版 &#xff08;原版地址&#xff1a;https://bbs.pcbeta.com/viewthread-1985546-1-1.html&#xff09;&#xff0c;感觉比原版流畅多了&#xff0c;重新按照自己习惯封装了下&#x…

Nvidia芯片Jetson系列 系统烧录环境 搭建

一、序言 Jetson 系列产品烧录系统的方法一般有两种&#xff1a; 一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统&#xff08;请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》&#xff09;。 另一种即为当前文档所描述的&#xff0c;在安装 Ub…

Azure数据分析Power BI

Azure数据分析Power BI 一、Power BI简介二、Power BI 如何匹配角色三、Power BI 构建基块四、使用 Power BI 服务一、Power BI简介 Microsoft Power BI 是一系列的软件服务、应用和连接器,这些软件服务、应用和连接器协同工作,将不相关的数据源转化为合乎逻辑、视觉上逼真的…

Java实现俄罗斯方块-初始化游戏界面的JPanel

目录 技术实现&#xff1a; 2.初始化游戏界面&#xff1b; 2.1 什么是游戏界面 2.2 JPanel面板 2.3 流布局管理器【FlowLayout】 2.4 网络布局管理器 【GridLayout】 2.5 边界布局管理器 技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 2.初始化游戏界面&#xff…

Docker的基本操作 及 容器与外部机互相通讯(持续更新中)

Docker入门&#xff1a; Docker 入门教程 - 阮一峰的网络日志 (ruanyifeng.com)docker入门&#xff0c;这一篇就够了。-CSDN博客Docker 容器使用 | 菜鸟教程 (runoob.com)Docker自定义网络和运行时指定IP_docker run ip-CSDN博客 基本命令 链接&#xff1a;docker入门&#…

Java面向对象-final关键字

Java面向对象-final关键字 一、final1、修饰变量2、修饰方法3、修饰类4、案例 一、final 可以修饰变量、方法、类 1、修饰变量 final修饰一个变量&#xff0c;变量的值不可以改变&#xff0c;这个变量就变成一个字符常量&#xff0c;约定俗称的规定&#xff1a;名字大写。 f…

【高端精品】最新手机版微信小程序(拼多多+京东)全自动操作项目

现代互联网经济的发展带来了新型的盈利方式&#xff0c;通过微信小程序的拼多多和京东进行商品自动巡视&#xff0c;为商家带来增的流量&#xff0c;同时为使用者带来利润。这种盈利方式无需复杂操作&#xff0c;用户仅需启动相应程序&#xff0c;商品信息便会被系统自动收集。…

DVWA - Brute Force

DVWA - Brute Force 等级&#xff1a;low ​ 直接上bp弱口令爆破&#xff0c;设置变量&#xff0c;攻击类型最后一个&#xff0c;payload为用户名、密码简单列表 ​ 直接run&#xff0c;长度排序下&#xff0c;不一样的就是正确的用户名和密码 ​ 另解&#xff1a; 看一下…

ElementPlus非表单组件ElUpload值更新后校验不消失问题

项目场景&#xff1a; el-form表单中有一个上传组件&#xff0c;有必填校验。 问题描述 先触发表单的必填校验(点击提交按钮)&#xff0c;然后再上传文件&#xff0c;必填校验的提示一直存在&#xff0c;如果再次点击提交&#xff0c;手动触发表单校验&#xff0c;必填校验消…

Oracle数据库Day03-单行函数

1. 单行函数 处理数据项接受函数并返回一个值对返回的每一行采取行动每行返回一个结果可能会修改数据类型可以嵌套接受可以是列或表达式的参数 function_name[(arg1, arg2,…)]

Retrofit 注解参数详解

添加依赖 implementation com.squareup.retrofit2:retrofit:2.9.0 implementation com.squareup.retrofit2:converter-gson:2.9.0 初始化Retrofit val retrofit Retrofit.Builder().baseUrl("http://api.github.com/").addConverterFactory(GsonConverterFactory…

设计模式之工厂方法模式(Factory Method Pattern)

目录 1.1、前言1.2、工厂方法模式简介1.2.1、工厂方法模式的主要特点1.2.2、工厂方法模式的主要结构1.2.3、使用工厂方法模式的好处 1.3、SpringBoot中那些场景使用了工厂方法模式1.4、日常工作中那些业务场景可以使用工厂方法模式1.5、工厂方法模式实战&#xff08;以某商场一…