C++复刻:[流光按钮]+[悬浮波纹按钮]

news2025/1/20 22:46:46

目录

  • 参考
  • 效果
  • 实现
    • main.cpp
    • dialog.h
    • dialog.cpp
    • flowingRayButton.h 流动光线按钮
    • flowingRayButton.cpp 流动光线按钮
    • hoveringRippleButton.h 悬浮波纹按钮
    • hoveringRippleButton.cpp 悬浮波纹按钮
    • 模糊知识点
  • 源码

参考

GitHub地址
B站主页

效果

在这里插入图片描述

实现

main.cpp

#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

dialog.h

dialog.cpp

#include "dialog.h"
#include "flowingRayButton.h"
#include "hoveringRippleButton.h"
#pragma execution_character_set("utf-8")
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    //隐藏最大化按钮|置顶
    setWindowFlags(this->windowFlags()& ~Qt::WindowMaximizeButtonHint|Qt::WindowStaysOnTopHint);
    this->resize(800, 800);
    this->setStyleSheet("background:#000000");
    // 流动光线按钮
    FlowingRayButton *a1 = new FlowingRayButton(this);
    a1->setGeometry(QRect(200, 100, 440, 140));
    a1->setBorder(6);

    auto w =new QWidget(this);
    w->setGeometry(0,270,this->width(),this->height());
    w->setStyleSheet("background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #00bd39, "
                     "stop:0.1 #00b844, stop:0.2 #00b44f, stop:0.3 #00af59, stop:0.4 #00aa64, "
                     "stop:0.5 #01a66f, stop:0.6 #01a17a, stop:0.7 #019c84, stop:0.8 #01988f, "
                     "stop:0.9 #01939a);");

    FlowingRayButton *a2 = new FlowingRayButton(this);
    a2->setGeometry(QRect(200, 300, 440, 140));

    /* Rborder-width 是一个自定义的属性,它不是官方的 CSS 属性;
     * Rborder-width 用于样式表中不会产生任何影响。可以忽略警告Unknown property Rborder-width*/
    a2->setStyleSheet("QFrame{"
                      "	background-color: rgba(255, 255, 255,255);"
                      "	border:none;"
                      "	border-radius:10px;"
                      " Rborder-width:10px;"
                      "}"
                      "QPushButton{border-radius: 15px;color:#ffffff;}"
                      );

    a2->setStyleSheetConfig();


    new HoveringRippleButton(this,QRect(200, 500, 440, 140), QSize(440, 140));
}

Dialog::~Dialog()
{
}

flowingRayButton.h 流动光线按钮

#ifndef FLOWINGRAYBUTTON_H
#define FLOWINGRAYBUTTON_H

#include <QFrame>
#include <QPushButton>
#include <QWidget>
#include <QLineEdit>
#include <QGraphicsBlurEffect>
#include <QRect>
#include <QSize>
#include <Qt>
#include <QTimer>
#include <QParallelAnimationGroup>
#include <QPropertyAnimation>
#include <QEasingCurve>
#include <QPoint>
#include <QSequentialAnimationGroup>
#include <QAbstractAnimation>
#include <QRegularExpression>
#include <QBrush>
#include <QColor>
#include <QCursor>
#include <QFont>
#include <QPainter>
#include <QPainterPath>
#include <QLinearGradient>
#include <QDebug>
// 流动光线按钮
class FlowingRayButton : public QFrame
{
    Q_OBJECT
public:
    FlowingRayButton(QWidget *parent = nullptr);
    ~FlowingRayButton();
    void setBorder(int border = 5); // 设置按钮在QFrame中的大小
    void setStyleSheetConfig();     // 根据样式重新配置(解析样式设置)
    QPushButton *getFlowingRayButton();
private:
    QPushButton *m_pPushButton;
    int border_radius;              // 边框圆角
    int border;                     // 边界
    QTimer *m_pTimer;
    int rect_1_offset;              //
    int rect_2_offset;
    int rect_1_start;
    int rect_2_start;
    int init_x;
    int flag;
    void initUI();
    void initAnimationConfig();     // 初始化动画配置
    void enterEvent(QEvent *event) override;//重写处理鼠标光标进入部件的事件
    void leaveEvent(QEvent *event) override;//重写处理鼠标光标离开部件的事件
    void paintEvent(QPaintEvent *event) override;//重写绘制事件

private slots:
    void offsetUpdate();            // 偏移更新
};

#endif // FLOWINGRAYBUTTON_H

flowingRayButton.cpp 流动光线按钮

#include "flowingRayButton.h"
// 流动光线按钮
FlowingRayButton::FlowingRayButton(QWidget *parent)
    : QFrame(parent)
{
    border_radius=10;
    border=5;
    initUI();
}

FlowingRayButton::~FlowingRayButton()
{

}

void FlowingRayButton::initUI()
{
    this->resize(300, 100);
    this->setStyleSheet("QFrame{"
                  "	background-color: rgba(255, 255, 255,0);"
                  "	border:none;"
                  "	border-radius:10px;"
                  " Rborder-width:5px;"
                  "}"
                  "QPushButton{border-radius: 5px;color:#ff0066;}"
                  );
    m_pPushButton = new QPushButton(this);
    setBorder();

    QFont font;
    font.setPointSize(25);

    m_pPushButton->setFont(font);
    m_pPushButton->setText("Start Coding");
    m_pTimer = new QTimer(this);
    m_pTimer->setInterval(10);      //间隔毫秒
    connect(m_pTimer, SIGNAL(timeout()), this, SLOT(offsetUpdate()));
    initAnimationConfig();
}

void FlowingRayButton::setBorder(int border)
{
    int btn_width = this->width() - border * 2;
    int btn_height = this->height() - border * 2;
    int btn_x = border;
    int btn_y = border;
    m_pPushButton->setGeometry(QRect(btn_x, btn_y, btn_width, btn_height));
}

 // 根据样式重新配置(解析样式设置)
void FlowingRayButton::setStyleSheetConfig()
{
    /*匹配规则;
     * 注意:正则表达式在找到第一个匹配项后就会停止查找,所以它不会再次匹配。
     * 从头开始查找匹配 border-radius: 的部分,然后尝试匹配一个或多个数字字符 (\\d+),而后匹配 px;
     * 使用 \\s* 来匹配可能存在的空格字符,包括零个或多个空格;
     * \\d+表示匹配一个或多个数字字符
     * 使用 (?P<border_radius>\\d+) 来匹配 border-radius 后面的数字,并将其命名为 border_radius;*/
    QRegularExpression radius_match("border-radius:\\s*(?P<border_radius>\\d+)px;");
    QRegularExpressionMatch radius_result = radius_match.match(this->styleSheet());
    if (radius_result.hasMatch())
    {
        //提取捕获组中命名为 border_radius的内容
        border_radius = radius_result.captured("border_radius").toInt();
    }

    QRegularExpression Rborder_width_match("Rborder-width:\\s*(?P<Rborder_width>\\d+)px;");
    QRegularExpressionMatch Rborder_width_result = Rborder_width_match.match(this->styleSheet());
    if (Rborder_width_result.hasMatch()) {
        border = Rborder_width_result.captured("Rborder_width").toInt();
    }

    // 根据样式重新配置QPushButton边界
    setBorder(border);
    initAnimationConfig();
}

// 初始化动画配置
void FlowingRayButton::initAnimationConfig()
{
    rect_1_offset = 0;
    rect_2_offset = 0;
    rect_1_start = 0;
    rect_2_start = -this->width();
    init_x = -this->width();
    flag = 0;
}

// 偏移更新
void  FlowingRayButton::offsetUpdate()
{
    if(rect_1_offset >= this->width()&&flag==0) {
        rect_1_offset = 0;
        rect_1_start = init_x;
        flag=1;
    }
    if(rect_1_offset >= this->width()*2&&flag==1) {
        rect_1_offset = 0;
        rect_1_start = init_x;
    }

    if (rect_2_offset >= this->width() * 2) {
        rect_2_offset = 0;
        rect_2_start = init_x;
    }

    rect_1_offset += 3;
    rect_2_offset += 3;

    update();
}

//重写处理鼠标光标进入部件的事件
void FlowingRayButton::enterEvent(QEvent *event)
{
    m_pTimer->start();
    // 调用父类的 enterEvent 函数,以保持默认行为
    QFrame::enterEvent(event);
}

//重写处理鼠标光标离开部件的事件
void FlowingRayButton::leaveEvent(QEvent *event)
{
    m_pTimer->stop();
    // 调用父类的 leaveEvent 函数,以保持默认行为
    QFrame::leaveEvent(event);
}

//重写绘制事件
void FlowingRayButton::paintEvent(QPaintEvent *event)
{
    // 调用父类的 paintEvent 函数,以保持默认行为
    QFrame::paintEvent(event);

    QPainterPath path;
    //添加一个带有圆角的矩形路径
    path.addRoundedRect(0, 0, this->width(), this->height(), border_radius, border_radius);

    QPainter painter(this);
    //设置渲染提示; QPainter::Antialiasing 是一种渲染提示,用于抗锯齿绘制,使得图形边缘更加平滑
    painter.setRenderHint(QPainter::Antialiasing);
    //设置画笔; Qt::NoPen 表示不使用画笔,也就是不绘制边框
    painter.setPen(Qt::NoPen);
    //设置剪裁路径,即限制绘制区域为指定的路径范围内
    painter.setClipPath(path);

    //线性渐变
    QLinearGradient gradient_1(rect_1_start + rect_1_offset, 0, rect_1_start + rect_1_offset + this->width(), 0);
    //在(0,1)之间设置颜色的渐变过程,将一个颜色逐渐过渡到另一个
    gradient_1.setColorAt(0, QColor(0, 164, 128, 230));
    gradient_1.setColorAt(0.166, QColor(13, 88, 166, 230));
    gradient_1.setColorAt(0.333, QColor(118, 8, 170, 230));
    gradient_1.setColorAt(0.5, QColor(255, 144, 0, 230));
    gradient_1.setColorAt(0.666, QColor(255, 255, 0, 230));
    gradient_1.setColorAt(0.833, QColor(165, 239, 0, 230));
    gradient_1.setColorAt(1, QColor(83, 223, 0, 230));

    painter.setBrush(gradient_1);
    painter.drawRect(rect_1_start + rect_1_offset, 0, this->width(), this->height());

    QLinearGradient gradient_2(rect_2_start + rect_2_offset, 0,rect_2_start + rect_2_offset + this->width(), 0);
    gradient_2.setColorAt(0, QColor(0, 164, 128, 230));
    gradient_2.setColorAt(0.166, QColor(13, 88, 166, 230));
    gradient_2.setColorAt(0.333, QColor(118, 8, 170, 230));
    gradient_2.setColorAt(0.5, QColor(255, 144, 0, 230));
    gradient_2.setColorAt(0.666, QColor(255, 255, 0, 230));
    gradient_2.setColorAt(0.833, QColor(165, 239, 0, 230));
    gradient_2.setColorAt(1, QColor(83, 223, 0, 230));

    painter.setBrush(gradient_2);
    painter.drawRect(rect_2_start + rect_2_offset, 0, this->width(), this->height());

}

QPushButton *FlowingRayButton::getFlowingRayButton()
{
    return m_pPushButton;
}

hoveringRippleButton.h 悬浮波纹按钮

#ifndef HOVERINGRIPPLEBUTTON_H
#define HOVERINGRIPPLEBUTTON_H

#include <QFrame>
#include <QFrame>
#include <QPushButton>
#include <QWidget>
#include <QPainter>
#include <QPainterPath>
#include <QTimer>
#include <QMouseEvent>
#include <QPropertyAnimation>
#include <QtCore/qmath.h>

//悬浮波纹按钮
class HoveringRippleButton : public QFrame
{
    Q_OBJECT
public:
    HoveringRippleButton(QWidget *parent = nullptr);
    HoveringRippleButton(QWidget *parent = nullptr, const QRect &geometry = QRect(), const QSize &minSize = QSize());
    ~HoveringRippleButton();

private:
    QRect geometry;
    QSize minSize;
    QPushButton *m_pPushButton;
    int corner_radius;              // 按钮的圆角半径
    int radius_var;                 // 半径变化值
    int radius;                     // 起始半径
    qreal max_radius;               // 最大半径
    QPoint center;                  // 鼠标点击坐标
    QColor color;                   // 填充颜色
    int msec;                       // 定时时间
    QTimer *m_pTimer;
    void initUI();
    void initAnimationConfig();     // 初始化动画配置
    void enterEvent(QEvent *event) override;//重写处理鼠标光标进入部件的事件
    void leaveEvent(QEvent *event) override;//重写处理鼠标光标离开部件的事件
    void paintEvent(QPaintEvent *event) override;//重写绘制事件
private slots:
    void incRadius();
    void decRadius();

};

#endif // HOVERINGRIPPLEBUTTON_H

hoveringRippleButton.cpp 悬浮波纹按钮

#include "hoveringRippleButton.h"
#pragma execution_character_set("utf-8")
//悬浮波纹按钮
HoveringRippleButton::HoveringRippleButton(QWidget *parent)
    : QFrame(parent)
{
    geometry=QRect(0,0,100,50);
    minSize =QSize(100,50);
    initUI();
}

HoveringRippleButton::HoveringRippleButton(QWidget *parent, const QRect &geometry, const QSize &minSize)
    : QFrame(parent), geometry(geometry), minSize(minSize)
{
    initUI();
}

HoveringRippleButton::~HoveringRippleButton()
{

}

void HoveringRippleButton::initUI()
{
    setMinimumSize(minSize);
    setStyleSheet("QFrame{"
                  "	background-color: rgb(46, 22, 177);"
                  "	border:none;"
                  "	border-radius:10px;"
                  "}"
                  "QPushButton{"
                  "	background-color: rgba(255, 255, 255, 0);"
                  "	color: rgb(255, 255, 255);"
                  "}");

    m_pPushButton = new QPushButton(this);
    m_pPushButton->setMinimumSize(minSize);
    m_pPushButton->setFixedSize(QSize(width(), height()));
    QFont font;
    font.setPointSize(25);
    m_pPushButton->setFont(font);
    m_pPushButton->setText("悬浮会变色喔");

    setGeometry(geometry);
    initAnimationConfig();
}

void HoveringRippleButton::initAnimationConfig()
{
    corner_radius = 10;                                     // 按钮的圆角半径
    radius_var = 2;                                         // 半径变化值
    radius = 0;                                             // 起始半径
    max_radius = qSqrt(width() * width() + height() * height());  // 最大半径
    center = QPoint();                                       // 鼠标点击坐标
    color = QColor(255, 89, 0);                              // 填充颜色
    msec = 10;                                               // 定时时间

    m_pTimer = new QTimer(this);
    m_pTimer->setInterval(msec);
    connect(m_pTimer,SIGNAL(timeout()), this, SLOT(incRadius()));
}

//重写处理鼠标光标进入部件的事件
void HoveringRippleButton::enterEvent(QEvent *event)
{
    // 调用父类的 enterEvent 函数,以保持默认行为
    QFrame::enterEvent(event);
    /* QCursor::pos() 获取当前鼠标的全局坐标
     * mapFromGlobal()将全局坐标转换为窗口内部相对坐标*/
    center = mapFromGlobal(QCursor::pos());
    m_pTimer->disconnect();
    connect(m_pTimer, SIGNAL(timeout()), this, SLOT(incRadius()));
    m_pTimer->start();
}

//重写处理鼠标光标离开部件的事件
void HoveringRippleButton::leaveEvent(QEvent *event)
{
    // 调用父类的 leaveEvent 函数,以保持默认行为
    QFrame::leaveEvent(event);
    center = mapFromGlobal(QCursor::pos());
    m_pTimer->disconnect();
    connect(m_pTimer, SIGNAL(timeout()), this, SLOT(decRadius()));
    m_pTimer->start();
}

//重写绘制事件
void HoveringRippleButton::paintEvent(QPaintEvent *event)
{
     // 调用父类的 paintEvent 函数,以保持默认行为
    QFrame::paintEvent(event);

    if (center.isNull()) {
        return;
    }

    QPainter painter(this);
    //设置渲染提示; QPainter::Antialiasing 是一种渲染提示,用于抗锯齿绘制,使得图形边缘更加平滑
    painter.setRenderHint(QPainter::Antialiasing);

    QBrush brush(color);
    painter.setBrush(brush);
    //设置画笔; Qt::NoPen 表示不使用画笔,也就是不绘制边框
    painter.setPen(Qt::NoPen);

    QPainterPath path;
    //添加一个带有圆角的矩形路径
    path.addRoundedRect(rect(), corner_radius, corner_radius);
    //设置剪裁路径,即限制绘制区域为指定的路径范围内
    painter.setClipPath(path);
    //绘制椭圆(长轴==长轴,就圆形)
    painter.drawEllipse(center, radius, radius);
}

void HoveringRippleButton::incRadius()
{
    radius += radius_var;
    if (radius > max_radius) {
        m_pTimer->stop();
        return;
    }
    update();
}

void HoveringRippleButton::decRadius()
{
    radius -= radius_var;
    if (radius < 0) {
        m_pTimer->stop();
        return;
    }

    update();
}

模糊知识点

  1. 使用QRegularExpression对象的match()函数,可以将正则表达式应用于目标文本,并检查是否存在匹配项;QRegularExpressionMatch类存储匹配结果,并提供方法来访问和提取捕获组中的具体内容。
 /*匹配规则;
 * 注意:正则表达式在找到第一个匹配项后就会停止查找,所以它不会再次匹配。
 * 从头开始查找匹配 border-radius: 的部分,然后尝试匹配一个或多个数字字符 (\\d+),而后匹配 px;
 * 使用 \\s* 来匹配可能存在的空格字符,包括零个或多个空格;
 * \\d+表示匹配一个或多个数字字符
 * 使用 (?P<border_radius>\\d+) 来匹配 border-radius 后面的数字,并将其命名为 border_radius;*/
QRegularExpression radius_match("border-radius:\\s*(?P<border_radius>\\d+)px;");
QRegularExpressionMatch radius_result = radius_match.match(this->styleSheet());
if (radius_result.hasMatch())
{
    //提取捕获组中命名为 border_radius的内容
    border_radius = radius_result.captured("border_radius").toInt();
}
  1. QPainterPath 用于绘制复杂图形路径的类;QPainter::setClipPath()设置剪裁路径,即限制绘制区域为指定的路径范围内
 QPainterPath path;
//添加一个带有圆角的矩形路径
path.addRoundedRectaddRoundedRect(qreal x, qreal y, qreal w, qreal h, qreal xRadius, qreal yRadius, Qt::SizeMode mode);

QPainter painter(this);
//设置渲染提示; QPainter::Antialiasing 是一种渲染提示,用于抗锯齿绘制,使得图形边缘更加平滑
painter.setRenderHint(QPainter::Antialiasing);
//设置画笔; Qt::NoPen 表示不使用画笔,也就是不绘制边框
painter.setPen(Qt::NoPen);
//设置剪裁路径,即限制绘制区域为指定的路径范围内
painter.setClipPath(path);
  1. QCursor::pos() 获取当前鼠标的全局坐标
    mapFromGlobal()将全局坐标转换为窗口内部相对坐标
QPoint mapFromGlobal(QCursor::pos());

源码

Gitee:06AnimationButton C++复刻:[流光按钮]+[悬浮波纹按钮]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows下配置vue开发环境

安装nodejs&#xff0c;配置npm 1.下载安装包&#xff1a;下载地址&#xff1a;https://nodejs.org/en/download 2.安装node&#xff1a;下载完成后进行安装&#xff0c;记住安装的文件夹。本人安装路径为 D:\Program Files\nodejs 3.配置环境变量&#xff1a; ①安装完成后…

高斯滤波和高通滤波

图像在频域里面&#xff0c;频率低的地方说明它是比较平滑的&#xff0c;因为平滑的地方灰度值变化比较小&#xff0c;而频率高的地方通常是边缘或者噪声&#xff0c;因为这些地方往往是灰度值突变的 所谓高通滤波就是保留频率比较高的部分&#xff0c;即突出边缘&#xff1b;…

Node.js介绍;浏览器和Node.j架构区别;Node的安装与管理;JS代码执行方式;Node的输入与输出;全局对象;

目录 1_Node.js介绍1.1_概念1.2_浏览器和Node.j架构区别1.3_Node.js应用场景 2_Node的安装与管理2.1_安装2.2_Node的版本工具2.3_版本管理工具&#xff1a;n 3_JavaScript代码执行4_Node的输入与输出4.1_REPL4.2_Node程序传递参数4.3_Node的输出 5_全局对象5.1_常见的全局对象5…

ClickHouse(六):Clickhouse数据类型-1

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…

一个类似Office用户界面的WPF库

博主介绍&#xff1a; &#x1f308;一个10年开发经验.Net老程序员&#xff0c;微软MVP、博客专家、CSDN/阿里云 .Net领域优质创作者&#xff0c;专注于.Net领域知识、开源项目分享&#xff01;&#x1f308; &#x1f6d5;文末获取&#xff0c;加入交流群&#x1f6d5; &#…

bitset优化例题

1. bitset 优化背包 https://loj.ac/p/515 题意&#xff1a; 给 n 个 < n 的数&#xff0c;每个数有取值范围 a[ i ] - b[ i ]&#xff0c;令 x 为 n 个数的平方和&#xff0c;求能构成的 x 的个数 样例&#xff1a; 5 1 2 2 3 3 4 4 5 5 6 26 思路&#xff1a; 背包d…

VUE之VueRouter页面跳转

参考资料&#xff1a; 参考视频 参考demo及视频资料 VUE之基本部署及VScode常用插件 VUE之基本组成和使用 VUE之Bootstrap和Element-UI的使用 VUE之axios使用&#xff0c;跨域问题&#xff0c;拦截器添加Token Vue Router官网 Vue Router说明&#xff1a; 说明&#xf…

SpringBoot接手JSP项目--【JSB项目实战】

SpringBoot系列文章目录 SpringBoot知识范围-学习步骤【JSB系列之000】 文章目录 SpringBoot系列文章目录[TOC](文章目录) SpringBoot技术很多很多工作之初&#xff0c;面临JSP的老项目我要怎么办环境及工具&#xff1a;项目里可能要用到的技术JSPjstl其它的必要知识 上代码WE…

数据结构:第六章 图

文章目录 一、图的基本概念1.1定义1.2有向图、无向图1.3顶点的度、入度、出度1.4顶点-顶点关系的描述1.5子图和生成子图1.6连通分量1.6强连通分量1.7生成树1.8生成森林1.9边的权、带权图/网1.10几种特殊的图1.11小结 二、图的存储及基本操作2.1邻接矩阵法2.1.1邻接矩阵存储不带…

29_互联网(The Internet)(IP数据包;UDP;TCP;DNS;OSI)

上篇介绍了计算机网络的基础知识&#xff0c;也提到互联网&#xff08;The Internet&#xff09;&#xff0c;本篇将会详细介绍互联网&#xff08;The Internet&#xff09;。 文章目录 1. 互联网&#xff08;The Internet&#xff09;组成及数据包传输过程2. IP 数据包的不足3…

【Spring Boot 源码学习】走近 AutoConfigurationImportSelector

AutoConfigurationImportSelector 源码解析 引言主要内容1. ImportSelector 接口2. DeferredImportSelector 接口3. AutoConfigurationImportSelector 功能概述 总结 引言 上篇博文我们了解了 EnableAutoConfiguration 注解&#xff0c;其中真正实现自动配置功能的核心实现者 …

手把手一起实现Visual Studio 2022本地工程提交(和克隆)Gitee

1、VS2022本地工程提交Gitee 登录Gitee&#xff0c;创建空仓库&#xff0c;如图&#xff1a; 新建仓库&#xff1a; 打开Visual Studio 2022创建的工程&#xff0c;点击创建Git存储库&#xff1a; 复制Gitee仓库URL&#xff1a; 将URL填入&#xff0c;点击创建并推送&#xff…

计算机基本硬件的内部结构

1.早期冯诺依曼机结构 世界上第一台计算机ENIAC是使用手动接线来控制计算&#xff0c;十分麻烦。 冯诺依曼提出“存储程序”的概念&#xff0c;是指将指令以二进制代码的形式事先输入计算机的主存储器&#xff08;内存&#xff09;&#xff0c;然后按照其在存储器中的首地址执…

【递归、搜索与回溯算法练习】day1

文章目录 一、面试题 08.06. 汉诺塔问题1.题目简介2.解题思路3.代码4.运行结果 二、21. 合并两个有序链表1.题目简介2.解题思路3.代码4.运行结果 三、206. 反转链表1.题目简介2.解题思路3.代码4.运行结果 总结 一、面试题 08.06. 汉诺塔问题 1.题目简介 面试题 08.06. 汉诺塔…

玩转LaTeX(二)【特殊字符、插图设置、表格、浮动体】

特殊字符&#xff1a; 导言区&#xff1a;&#xff08;添加几个宏包&#xff09; \usepackage{xltxtra} %\XeLaTeX(提供了针对XeTeX的改进并且加入了XeTeX的LOGO)\usepackage{texnames} %LOGO\usepackage{mflogo}\usepackage{ctex} 正文区&#xff1a; \begin{document}…

vue拖拽改变宽度

1.封装组件ResizeBox.vue <template><div ref"resize" class"resize"><div ref"resizeHandle" class"handle-resize" /><slot /></div> </template> <script> export default {name: Resi…

【八】mybatis 日志模块设计

mybatis 日志模块设计 简介&#xff1a;闲来无事阅读一下mybatis的日志模块设计&#xff0c;学习一下优秀开源框架的设计思路&#xff0c;提升自己的编码能力 模块设计 在Mybatis内部定义了4个级别&#xff1a;Error:错误 、warn:警告、debug:调试、trance&#xff0c;日志优…

C++STL序列式容器——vector容器详解

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.vector容器基本概念二.vector常用操作①vector构造函数②特性操作③元素操作④赋值操作⑤交换操作⑥比较操作⑦插入和删除操作 一.vector容器基…

MATLAB编程实践12、13

生命游戏 游戏的宇宙是无限可扩展的二维矩形网格&#xff0c;群体是那些标注为存活的网格的集合。群体可以依照称为代的离散时间步距进化。在每一步中&#xff0c;每个网格的命运由它周围最近的8个网格邻居的活度决定&#xff0c;规则如下&#xff1a; 如果一个存活的网格有两个…

想阻止BOT攻击?一起聚焦灵活有效的F5解决方案

伴随着突如其来的数字创新&#xff0c;使潜在的欺诈无处不在。现在&#xff0c;帮我们查找机票交易、位置理想的演唱会座位的 BOT技术正在为网络犯罪分子所利用。权威数据表示&#xff0c;在过去5年&#xff0c;撞库攻击已成为造成经济损失的最大原因之一&#xff0c;几乎每个企…