QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目录

  • 引出
  • 定时器事件
    • QTimerEvent
    • QTimer
  • 事件的分发
    • 事件过滤器
  • 总结
  • QT中的鼠标事件
    • 定义QLable的鼠标进入离开事件
    • 提升为myLabel
    • 重写QLabel的函数
      • 鼠标的事件
      • 鼠标的左中右键枚举
      • 鼠标多事件获取和鼠标移动
      • 鼠标追踪
  • QT中的信号和槽
    • 自定义信号和槽
      • 1.自定义信号
      • 2.自定义槽
      • 3.建立连接
      • 4.进行触发
    • 自定义信号重载
      • 带参数的
      • 按钮触发
      • 信号触发信号
      • 拓展
    • lambda表达式
      • 返回值
      • mutable修饰
      • 案例

引出

QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

在这里插入图片描述


定时器事件

QTimerEvent

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#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();

    // 重写定时器事件
    void timerEvent(QTimerEvent *);

    int id1; // 定时器1的唯一标识
    int id2; // 定时器2的唯一标识

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如何定义多个定义器事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 启动定时器
    // 参数1 间隔 单位 毫秒
    id1 = startTimer(1000);

    id2 = startTimer(2000);
}

void Widget::timerEvent(QTimerEvent * ev)
{
    if(ev->timerId()==id1){
        static int num =1;
        // label1 每间隔1秒
        ui->label_2->setText(QString::number(num++));
    }

    // label2 每间隔2s
    if(ev->timerId()==id2){
        static int num2 = 1;
        ui->label_3->setText(QString::number(num2++));
    }


    // label3 每间隔3s

}


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

QTimer

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

定时器实现的另一种方式:实例化定时器QTimer 然后加到对象树上

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进行定时信号的发送和处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include "widget.h"
#include "ui_widget.h"
#include <QTimer> // 定时器的类

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 启动定时器
    // 参数1 间隔 单位 毫秒
    id1 = startTimer(1000);
    id2 = startTimer(2000);

    // 定时器的第二种方式,实例化,加到对象树上
    QTimer *timer = new QTimer(this);
    //  启动定时器
    timer->start(500); // 每隔500ms

    connect(timer,&QTimer::timeout,
            [=](){
        static int num = 1;
        ui->label_4->setText(QString::number(num++));
    });

    // 点击暂停按钮,停止定时器
    connect(ui->btnStop,&QPushButton::clicked,
            [=](){
        timer->stop();
    });

}

void Widget::timerEvent(QTimerEvent * ev)
{
    if(ev->timerId()==id1){
        static int num =1;
        // label1 每间隔1秒
        ui->label_2->setText(QString::number(num++));
    }

    // label2 每间隔2s
    if(ev->timerId()==id2){
        static int num2 = 1;
        ui->label_3->setText(QString::number(num2++));
    }


    // label3 每间隔3s

}


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

事件的分发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过重写event事件分发器,拦截鼠标按下的的事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

事件的枚举类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

静态类型转换方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标按下的事件拦截,自己处理,返回True;
其他事件交给父类进行处理,默认处理;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

bool myLabel::event(QEvent *e)
{
    // 如果是鼠标按下,在event事件分发中做拦截操作
    if(e->type()==QEvent::MouseButtonPress)
    {
        QString str1 = QString("鼠标按下了,在event事件分发中处理");
        qDebug() << str1;

        // 需要进行类型转换
        QMouseEvent * ev = static_cast<QMouseEvent *>(e);
        QString str = QString("鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4")
                .arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
        return true; // 代表用户自己处理,不向下分发
    }

    // 其他事件,交给父类处理,默认处理
    return QLabel::event(e);
}

事件过滤器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以在event之前,再做一次高级的拦截

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤:1.给label1安装事件过滤器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤二:重写事件过滤器的事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里有两个参数,obj 和 e,一个用于判断控件,另一个用来判断事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include "widget.h"
#include "ui_widget.h"
#include <QTimer> // 定时器的类
#include <QDebug>
#include <QMouseEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 启动定时器
    // 参数1 间隔 单位 毫秒
    id1 = startTimer(1000);
    id2 = startTimer(2000);

    // 定时器的第二种方式,实例化,加到对象树上
    QTimer *timer = new QTimer(this);
    //  启动定时器
    timer->start(500); // 每隔500ms

    connect(timer,&QTimer::timeout,
            [=](){
        static int num = 1;
        ui->label_4->setText(QString::number(num++));
    });

    // 点击暂停按钮,停止定时器
    connect(ui->btnStop,&QPushButton::clicked,
            [=](){
        timer->stop();
    });

}

void Widget::timerEvent(QTimerEvent * ev)
{
    if(ev->timerId()==id1){
        static int num =1;
        // label1 每间隔1秒
        ui->label_2->setText(QString::number(num++));
    }

    // label2 每间隔2s
    if(ev->timerId()==id2){
        static int num2 = 1;
        ui->label_3->setText(QString::number(num2++));
    }

    // 给label1安装事件过滤器
    // 步骤1:安装事件的过滤器
    ui->label->installEventFilter(this);
}


bool Widget::eventFilter(QObject * obj, QEvent * e){
    if(obj == ui->label){
        if(e->type() == QEvent::MouseButtonPress){
            QMouseEvent * ev = static_cast<QMouseEvent *>(e);
            QString str = QString("事件过滤器===鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4")
                    .arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
            qDebug() << str;
            return true;
        }
    }

    // 其他默认处理
    return QWidget::eventFilter(obj,e);

}


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


总结

QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

QT中的鼠标事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

定义QLable的鼠标进入离开事件

注意这里的QWidget后面要改成QLabel

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include "mylabel.h"
#include <QDebug>

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}


// 鼠标进入
void myLabel::enterEvent(QEvent *event)
{
    qDebug() << "鼠标进入了";
}

// 鼠标离开
void myLabel::leaveEvent(QEvent *)
{
    qDebug() << "鼠标离开了";
}

提升为myLabel

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重写QLabel的函数

鼠标的事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于控件的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标的左中右键枚举

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标多事件获取和鼠标移动

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

头文件

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

class myLabel : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = nullptr);

    // 鼠标进入
    void enterEvent(QEvent *event);

    // 鼠标离开
    void leaveEvent(QEvent *);

    // 鼠标放下和释放
    virtual void mousePressEvent(QMouseEvent *ev);
    virtual void mouseReleaseEvent(QMouseEvent *ev);

    // 鼠标的移动
    virtual void mouseMoveEvent(QMouseEvent *ev);

signals:

};

#endif // MYLABEL_H

cpp文件

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}


// 鼠标进入
void myLabel::enterEvent(QEvent *event)
{
//    qDebug() << "鼠标进入了";
}

// 鼠标离开
void myLabel::leaveEvent(QEvent *)
{
//    qDebug() << "鼠标离开了";
}

// 鼠标放下和释放
void myLabel::mousePressEvent(QMouseEvent *ev)
{

    // 鼠标左键按下打印
    if(ev->button() == Qt::LeftButton){
        QString str = QString("鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4")
                .arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
    }

}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    qDebug() << "鼠标释放";
}

// 鼠标的移动
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
    if(ev->buttons() & Qt::LeftButton)
    {
        qDebug() << "鼠标移动";
    }
}

鼠标追踪

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

QT中的信号和槽

自定义信号和槽

1.自定义信号

写到signals下
返回void
需要声明,不需要实现
可以有参数,可以重戟

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.自定义槽

返回void
需要声明,也需要实现
可以有参数,可以重载
写到public slot下或者public或者全局函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.建立连接

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

// 老师饿了,学生请吃饭
connect(te,&Teacher::hungry,st,&Student::treat);

4.进行触发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义信号重载

当自定义信号和槽出现重载
8.1 需要利用还数指针明确指向函数的地址·
8.2void(Teacher::tsignal )QString )=&Teacher::hungry;
8.3 QString转成char *
8.3.1.ToUtf80转为QByteArray
8.3.2.Data0转为Char *
8.4信号可以连接信号
8.5断开信号disconnect

带参数的

    void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
    void (Student::*StudentSlot)(QString) = &Student::treat;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void Student::treat(QString foodName){
    // QString -> char * 先转成QByteArray(.toUtf8())  再转成Char* ()
    qDebug() << "请老师吃。。。" << foodName.toUtf8().data();
}

按钮触发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    // 用一个按钮调用下课
    QPushButton *btn = new QPushButton("下课了",this);

    // 重置窗口daxiao
    this->resize(600,400);

    connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

信号触发信号

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    // 无参的信号和槽连接
    void (Teacher::*teacherSignal2)(void) = &Teacher::hungry;
    void (Student::*StudentSlot2)(void) = &Student::treat;
    connect(te,teacherSignal2,st,StudentSlot2);

    // 信号连接信号
    connect(btn,&QPushButton::clicked,te,teacherSignal2);

断开信号disconnect

拓展

1、信号是可以连接信号
2、一个信号可以连接多个槽函数
3、多个信号可以连接同一个糟函数
4、信号和槽函数的参数必须类型一一对应
5、信号和槽的参数个数是不是要一致?信号的参数个数可以多余槽函数的参数个数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

connect(信号的发送者,发送的信号signal信号),信号接受者,槽函数SLOT)
优点:参数直观
缺点:编译器不会检测爸数类型:

lambda表达式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

在这里插入图片描述

    [=](){
        btn->setText("aaa");
    }();

返回值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    int ret = []()->int{return 1000;}();
    qDebug() << "ret = " << ret;

mutable修饰

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    QPushButton *myBtn1 = new QPushButton(this);
    QPushButton *myBtn2 = new QPushButton(this);
    myBtn1->move(100,100);
    int m = 10;
    connect(myBtn1,&QPushButton::clicked,this,
            [m]()mutable {m=100+10;qDebug()<< m;});
    connect(myBtn2,&QPushButton::clicked,this,
            [=](){qDebug()<<m;});
    qDebug() << m;

案例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    QPushButton * btnClose = new QPushButton;
    btnClose->setText("close");
    btnClose->move(100,0);
    btnClose->setParent(this);
    connect(btnClose,&QPushButton::clicked,this,
            [=](){
        btnClose->setText("关闭");
        emit te->hungry("娃哈哈");
//        this->close();
    });

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

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

相关文章

了解 PostgerSQL 的门户 – Executor vs Process Utility

当您向 PostgreSQL 发送查询时&#xff0c;查询会依次经历多个处理阶段&#xff0c;并在最后返回结果。这些阶段称为&#xff1a; 解析 分析 重写 计划 执行 在另一篇文章中&#xff0c;我简要概述了PostgreSQL在每个查询处理阶段的主要责任。你可以在这里找到它。 https…

SS8812T替代DRV8812的国产双通道H桥电机驱动芯片

由工采网代理的SS8812T是一款国产双通道H桥电机驱动芯片&#xff1b;该芯片为打印机和其它电机一体化应用提供一种双通道集成电机驱动方案&#xff1b;可Pin-to-Pin兼容替代DRV8812&#xff0c;可广泛应用于POS、打印机、安防相机、办公自动化设备、游戏机、机器人等。 产品描述…

14-8 小型语言模型的兴起

过去几年&#xff0c;我们看到人工智能能力呈爆炸式增长&#xff0c;其中很大一部分是由大型语言模型 (LLM) 的进步推动的。GPT-3 等模型包含 1750 亿个参数&#xff0c;已经展示了生成类似人类的文本、回答问题、总结文档等能力。然而&#xff0c;虽然 LLM 的能力令人印象深刻…

第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年8月21日真题

第14届蓝桥杯Python青少组中/高级组选拔赛&#xff08;STEMA&#xff09;2022年8月21日真题 题目总数&#xff1a;5 总分数&#xff1a;128 更多真题下载点我&#x1f447;https://pan.baidu.com/s/1JRLLwW2C-OBbcY2tJ3uYJg?pwd2wk2 编程题 第 1 题 问答题 编程实现&…

antd实现简易相册,zdppy+vue3+antd实现前后端分离相册

前端代码 <template><a-image:preview"{ visible: false }":width"200"src"http://localhost:8889/download/1.jpg"click"visible true"/><div style"display: none"><a-image-preview-group:previe…

【设计模式】设计模式学习线路与总结

文章目录 一. 设计原则与思想二. 设计模式与范式三. 设计模式进阶四. 项目实战 设计模式主要是为了改善代码质量&#xff0c;对代码的重用、解耦以及重构给了最佳实践&#xff0c;如下图是我们在掌握设计模式过程中需要掌握和思考的内容概览。 一. 设计原则与思想 面向对象编…

PMP--知识卡片--波士顿矩阵

文章目录 记忆黑话概念作用图示 记忆 一说到波士顿就联想到波士顿龙虾&#xff0c;所以波士顿矩阵跟动物有关&#xff0c;狗&#xff0c;牛。 黑话 你公司的现金牛业务&#xff0c;正在逐渐变成瘦狗&#xff0c;应尽快采取收割策略&#xff1b;问题业务的储备太少&#xff0…

AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!

一、前言 2017年&#xff0c;谷歌团队推出一篇神经网络的论文&#xff0c;首次提出将“自注意力”机制引入深度学习中&#xff0c;这一机制可以根据输入数据各部分重要性的不同而分配不同的权重。当ChatGPT震惊世人时&#xff0c;Transformer也随之进入大众视野。一夜之间&…

【机器学习】连续字段的特征变换

介绍 除了离散变量的重编码外&#xff0c;有的时候我们也需要对连续变量进行转化&#xff0c;以提升模型表现或模型训练效率。在之前的内容中我们曾介绍了关于连续变量标准化和归一化的相关内容&#xff0c;对连续变量而言&#xff0c;标准化可以消除量纲影响并且加快梯度下降…

智能合约与企业数字化转型:案例分析与未来展望

随着区块链技术的快速发展&#xff0c;智能合约作为其重要应用之一&#xff0c;正逐渐成为推动企业数字化转型的关键工具。智能合约不仅可以自动执行和验证合同&#xff0c;还能够增强数据安全性、优化业务流程&#xff0c;并提升企业间的信任和透明度。本文将深入探讨智能合约…

CPU cache

参考&#xff1a;https://levelup.gitconnected.com/understanding-l1-l2-and-l3-caches-how-to-improve-cpu-performance-d9dcc3e2e1f5 2、以下部分&#xff1a;如何获取x86 CPU L1、L2和L3 cache的大小 - 知乎 (zhihu.com) CPU cache是介于CPU内核和物理内存&#xff08;动态…

ssm校园志愿服务信息系统-计算机毕业设计源码97697

摘 要 随着社会的进步和信息技术的发展&#xff0c;越来越多的学校开始重视志愿服务工作&#xff0c;通过组织各种志愿服务活动&#xff0c;让学生更好地了解社会、服务社会。然而&#xff0c;在实际操作中&#xff0c;志愿服务的组织和管理面临着诸多问题&#xff0c;如志愿者…

实战演练:Fail2Ban部署全攻略,确保您的服务器免受CVE-2024-6387侵害!

Fail2Ban是一个开源的入侵防护软件&#xff0c;它可以扫描日志文件&#xff0c;识别恶意行为&#xff08;如多次失败的登录尝试&#xff09;&#xff0c;并自动采取措施&#xff08;如更新防火墙规则&#xff09;来阻止攻击者。最近&#xff0c;CVE-2024-6387漏洞的爆出使我们更…

一分钟学习数据安全—自主管理身份SSI分布式加密密钥管理

在这篇之前&#xff0c;我们已经对SSI有了一个全局的了解。这个系列的文章可以作为一个学习笔记来参考&#xff0c;真正要实践其中的一些方案、协议&#xff0c;还需要参考专业的书籍和官方文档。作为一个SSI系列学习笔记的最后一篇&#xff0c;我们做一个简单的延伸&#xff0…

无服务器【Serverless】架构的深度剖析:组件介绍、优缺点与适用场景

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、云计算的发展趋势 2、无服务器计算简介 二、无服务…

DPDK概述

文章目录 1. DPDK概述1.1 DPDK 内存管理Mbuf单帧结构:1.2 DPDK内核驱动 igb_uio驱动1.3 DPDK源码下载方式1.4 pktgen源码下载方式1.5 DPDK相关名词解释 1. DPDK概述 Intel DPDK全称Intel Data Plane Development Kit&#xff0c;是Intel提供的数据平面开发工具集&#xff0c;为…

AI语音工具——Fish Speech:使用简单,可训练专属语音模型!

今天给大家介绍一款超好用的AI语音工具——Fish Speech&#xff0c;使用简单&#xff0c;还可以训练自己的语音模型&#xff01; 工具介绍 Fish Speech是由 Fish Audio 开发的免费开源文本转语音模型。经过十五万小时的数据训练&#xff0c;Fish Speech能够熟练掌握中文、日语…

binutils ifunc 流程图

上图是x86 binutils 的流程图。 函数说明_bfd_x86_elf_link_hash_table_createInit local STT_GNU_IFUNC symbol hash.elf_x86_64_check_relocsAdd support for handling STT_GNU_IFUNC symbols_bfd_elf_x86_get_local_sym_hashFind and/or create a hash entry for local sym…

SSL/CA 证书及其相关证书文件解析

在当今数字化的时代&#xff0c;网络安全变得至关重要。SSL&#xff08;Secure Socket Layer&#xff09;证书和CA&#xff08;Certificate Authority&#xff09;证书作为保护网络通信安全的重要工具&#xff0c;发挥着关键作用。 一、SSL证书 SSL证书是数字证书的一种&…

前端八股文 说一下盒模型

网页中任何一个元素都可以视为一个盒子&#xff0c;由里到外&#xff0c;盒模型包括外边界&#xff08;margin&#xff09;、边框&#xff08;border&#xff09;、内边界&#xff08;padding&#xff09;和内容&#xff08;content&#xff09;。 盒模型基本分为3种&#xff1…