QT_02 窗口属性、信号槽机制

QT - 窗口属性、信号槽机制

1. 设置窗口属性

窗口设置

1,标题
2,大小
3,固定大小
4,设置图标

widget.cpp 文件中:

//设置窗口大小,此时窗口是可以拉大拉小的
//1参:宽度
//2参:高度
this->resize(800, 600);
//设置窗口标题
this->setWindowTitle("QT第一个窗口界面");
//设置窗口大小不可改变
this->setFixedSize(800, 600);
//设置图标
//this->setWindowIcon();

在这里插入图片描述

2. 按钮 QPushButton

构造函数QPushButton(父容器)设置文本setText
获取文本text
设置大小resize
移动move

2.1 方式一:代码创建

widget.cpp 文件中:

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>  //1、引入按钮所需头文件
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);ui->setupUi(this);//设置窗口大小,此时窗口是可以拉大拉小的//1参:宽度//2参:高度this->resize(800, 600);//设置窗口标题this->setWindowTitle("QT第一个窗口界面");//设置窗口大小不可改变this->setFixedSize(800, 600);//2、创建按钮对象QPushButton *btn01 = new QPushButton;//3、设置按钮父容器,此处是当前窗口btn01->setParent(this);//3.1 设置按钮大小//btn01->setFixedSize(300,50);//4、设置位置btn01->move(100, 100);//5、设置按钮文本btn01->setText("按钮");
}Widget::~Widget()
{delete ui;
}

在这里插入图片描述

2.2 方式二:图形界面

在这里插入图片描述

在这里插入图片描述

3. 信号与槽机制

//Qt4: 
connect(btn, SIGNAL(clicked(bool)), this, SLOT( close() ) );
//Qt5: 
connect(btn, &QPushButton::clicked, this, &QWidget::close );

3.1 概述

信号槽是 Qt 框架引以为豪的机制之一。

所谓信号槽,实际就是 观察者模式

  • 当某个事件发生之后,比如,按钮检测到自己被点击了一下, 它就会发出一个信号( signal) 。这种发出是没有目的的,类似广播。 如果有对象对这个信号感兴趣,它就会使用连接( connect)函数,意思是, 将想要处理的信号和自己的一个函数(称为槽( slot))绑定来处理这个信号。
  • 也就是说, 当信号发出时, 被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

在这里插入图片描述

注意:

  • 核心在于 发送者 与 接受者
  • 发送者 可以 发出多种信号,被多个不同的接收者接收
  • 接收者 有多个槽函数接收不同的发送者发出的信号

3.2 信号与槽的链接

connect() 函数

connect(sender, signal, receiver, slot)

参数:

  • sender:发送者
  • signal:发出的信号
  • receiver:接受者
  • slot:槽函数

示例1:

//ui文件中名为btnclose的按钮发出点击信号
//被当前窗口接收,执行关闭窗口的操作//qt5的写法
connect(ui->btnclose,&QPushButton::clicked,this,&Widget::close);//qt4的写法
//connect(ui->btnclose,SIGNAL(clicked(bool)),this,SLOT(close()));

示例2:

//信号与槽函数有参数
//qt5的写法
//void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;
//void (Widget:: *myfun_p)(bool) = &Widget::myfun;
//connect(ui->btnclose,cli_p,this,myfun_p);
//qt4的写法
connect(ui->btnclose,SIGNAL(clicked(bool)),this,SLOT(myfun(bool)));

3.3 系统提供的信号与槽

3.3.1 QWidget提供

信号:

void customContextMenuRequested(const QPoint &pos) //请求上下文菜单时
void windowIconChanged(const QIcon &icon) //窗口图标改变时
void windowTitleChanged(const QString &title) //窗口标题改变时

槽:

bool close() // 关闭
void hide() // 隐藏
void lower()
void raise()
void repaint() // 重新加载
void setDisabled(bool disable)
void setEnabled(bool)
void setFocus()
void setHidden(bool hidden)
void setStyleSheet(const QString &styleSheet)
virtual void setVisible(bool visible)
void setWindowModified(bool)
void setWindowTitle(const QString &)
void show() // 显示
void showFullScreen() // 全屏显示
void showMaximized() // 最大化显示
void showMinimized() // 最小化显示
void showNormal()
void update()
3.3.2 QPushButton提供

继承于父类的 QAbstractButton的信号

信号:

void clicked(bool checked = false) //点击信号
void pressed() //按钮按下信号 (按下)
void released() //按钮释放信号(抬起)
void toggled(bool checked) //触发(开或关)
3.3.3 示例

如1: 当前窗口添加一个关闭按钮,点击之后关闭窗口(退出程序)

#include "widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent)
{setFixedSize(800, 640);QPushButton *btn= new QPushButton("关闭", this);btn->setFixedSize(120, 50);btn->move(10, 10);// 当前类对象对 QPushButton的点击事件感兴趣// 使用connect()进行绑定到当前窗口的close()// 发送者和接收者都是QObject类的对象的指针// Qt5的信号绑定槽函数的方式connect(btn, &QPushButton::clicked, this, &Widget::close);
}

如2:当前窗口中添加一个按钮,当按下时最大化显示窗口,再点时,恢复之前的状态

#include "widget.h"
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent)
{resize(800, 640); // 窗口的初始大小// setMaximumSize(1200, 960); // 设置窗口最大值QPushButton *btn= new QPushButton("关闭", this);btn->setFixedSize(120, 50);btn->move(10, 10);// 当前类对象对 QPushButton的点击事件感兴趣// 使用connect()进行绑定到当前窗口的close()// 发送者和接收者都是QObject类的对象的指针// Qt5的信号绑定槽函数的方式connect(btn, &QPushButton::clicked, this, &Widget::close);QPushButton *maxBtn = new QPushButton("最大化", this);maxBtn->setFixedSize(120, 50);maxBtn->move(10, 70);// 绑定的槽函数是自定义的成员函数connect(maxBtn, &QPushButton::clicked, this, &Widget::toggleShow);
}// 在public区域声明的函数 toggleShow()
void Widget::toggleShow(){// qDebug()引入 <QDebug> 头qDebug() << "show or hide:" << this->isMaximized() << endl;if(isMaximized()){showNormal(); // 槽函数可以作为成员函数使用}else{showMaximized();}
}

3.4 自定义信号与槽

3.4.1 注意事项
  1. 发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外)
  2. 信号和槽函数 返回值类型是 void
  3. 信号 只需要声明,不需要实现
  4. 槽函数 需要声明也需要实现
  5. 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected的影响;
  6. 使用 emit 在恰当的位置发送信号;
  7. 使用 connect() 函数 连接信号和槽。
  8. 任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数
  9. 信号槽要求信号和槽的 参数一致,所谓一致,是 参数类型一致
  10. 如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)。
3.4.2 无参

下课了,老师饿了,学生请吃饭

widget.h 没变化

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "teacher.h"
#include "student.h"
#include <QPushButton>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->resize(800, 600);this->setFixedSize(800, 600);this->setWindowTitle("老师饿了,学生请吃饭");QPushButton *btn = new QPushButton;btn->setParent(this);btn->move(100, 100);btn->setText("下课");//创建学生和老师对象Teacher *tea = new Teacher();Student *stu = new Student();//关联1:按钮和老师对象,//按钮:发送者; clicked:发出的信号; tea:接收者; down:槽函数connect(btn, QPushButton::clicked, tea, Teacher::down);//关联2:老师和学生对象,//tea:发送者; hungry:发出的信号; stu:接收者; eat:槽函数connect(tea, Teacher::hungry, stu, Student::eat);
}Widget::~Widget()
{delete ui;
}

新建 teacher.h

#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = 0);signals://信号void hungry();public slots://槽函数void down();
};#endif // TEACHER_H

新建 teacher.cpp

#include "teacher.h"
#include <QDebug>Teacher::Teacher(QObject *parent) : QObject(parent)
{}void Teacher::down()
{//发送信号emit this->hungry();
}

新建 student.h

#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = 0);signals:public slots:void eat();
};#endif // STUDENT_H

新建 student.cpp

#include "student.h"
#include <QDebug>Student::Student(QObject *parent) : QObject(parent)
{}void Student::eat()
{qDebug() << endl << "请吃饭" << endl;
}

在这里插入图片描述

3.4.3 有参

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "teacher.h"
#include "student.h"
#include <QPushButton>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->resize(800, 600);this->setFixedSize(800, 600);this->setWindowTitle("老师饿了,学生请吃饭");QPushButton *btn = new QPushButton;btn->setParent(this);btn->move(100, 100);btn->setText("下课");Teacher *tea = new Teacher();Student *stu = new Student();//关联1:按钮和老师对象,//按钮:发送者; clicked:发出的信号; tea:接收者; down:槽函数connect(btn, QPushButton::clicked, tea, Teacher::down);//关联2:老师和学生对象,//tea:发送者; hungry:发出的信号; stu:接收者; eat:槽函数
//    connect(tea, Teacher::hungry, stu, Student::eat01);connect(tea, Teacher::hungry, stu, Student::eat02);//槽的参数只能小于等于信号的参数,eat03报错connect(tea, Teacher::hungry, stu, Student::eat03);
}Widget::~Widget()
{delete ui;
}

新建 teacher.h

#ifndef TEACHER_H
#define TEACHER_H#include <QObject>
#include <QString>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = 0);signals://有参数void hungry(int num, QString foodName);public slots:void down();
};#endif // TEACHER_H

新建 teacher.cpp

#include "teacher.h"
#include <QDebug>Teacher::Teacher(QObject *parent) : QObject(parent)
{}void Teacher::down()
{emit this->hungry(3, "油泼面");
}

新建 student.h

#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = 0);signals:public slots://小于信号参数void eat01();//大于信号参数void eat02(int num, QString foodName);//大于信号参数void eat03(int num, int x, QString foodName);
};#endif // STUDENT_H

新建 student.cpp

#include "student.h"
#include <QDebug>Student::Student(QObject *parent) : QObject(parent)
{}void Student::eat01()
{qDebug() << endl << "eat01" << endl;
}void Student::eat02(int num, QString foodName)
{qDebug() << endl << "eat02:\tnum:" << num << "\tfoodName:" << foodName << endl;
}void Student::eat03(int num, int x, QString foodName)
{qDebug() << endl << "eat03" << endl;
}

在这里插入图片描述
在这里插入图片描述

3.5 信号与槽拓展

3.5.1 一个信号可以和多个槽相连

槽会一个接一个的被调用,但是它们的调用顺序是不确定

3.5.2 多个信号可以连接到一个槽

只要任意一个信号发出,这个槽就会被调用

3.5.3 一个信号可以连接到另外的一个信号

当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。

3.5.4 信号槽可以断开

利用 disconnect 关键字是可以断开信号槽的

3.5.5 槽可以被取消链接

这种情况并不经常出现,因为当一个对象 delete 之后,Qt 自动取消所有连接到这个对象上面的槽

3.5.6 示例

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;public slots:void myslot01();void myslot02();void myslot03();
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);setWindowTitle("信号与槽的拓展");setFixedSize(800,600);QPushButton *btn01 = new QPushButton("一个信号连接多个槽",this);btn01->resize(300,50);connect(btn01,QPushButton::clicked,this,Widget::myslot01);connect(btn01,QPushButton::clicked,this,Widget::myslot02);connect(btn01,QPushButton::clicked,this,Widget::myslot03);QPushButton *btn02 = new QPushButton("多个信号连接一个槽",this);btn02->resize(300,50);btn02->move(0,50);connect(btn02,QPushButton::clicked,this,Widget::myslot01);QPushButton *btn03 = new QPushButton("一个信号连接另一个信号",this);btn03->resize(300,50);btn03->move(0,100);connect(btn03,QPushButton::clicked,btn01,QPushButton::clicked);//槽可以被取消链接//delete btn01;//信号与槽可以断开
//    btn03->disconnect(btn01);
}Widget::~Widget()
{delete ui;
}void Widget::myslot01()
{qDebug() << endl << "myslot01" << endl;
}
void Widget::myslot02()
{qDebug() << endl << "myslot02" << endl;
}
void Widget::myslot03()
{qDebug() << endl << "myslot03" << endl;
}

在这里插入图片描述

  • 一个信号连接多个槽:

在这里插入图片描述

  • 多个信号连接一个槽

    在这里插入图片描述

  • 一个信号连接另一个信号

    在这里插入图片描述

  • 信号与槽可以断开:断开后无响应

3.6 Lambda表达式

C++11 中的 Lambda 表达式用于定义并创建匿名的函数对象

作用:简化编程工作。

3.6.1 语法
[函数对象参数](操作符重载函数参数) mutable ->返回值{函数体}

解释:

  • [ ]:lambda表达式符号,,可以啥都不写,不能省略
    • 函数对象参数
      • 空 没有使用任何函数对象参数
      • = 可以访问外部变量只能读
      • a,b 能对lambda外的a,b变量读操作
      • & lambda外的变量读写操作
      • a,&b 对外部的a读 b读写
      • this 函数体内可以使用 Lambda 所在类中的成员变量
  • ():形参列表
3.6.2 示例

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;int m;int n;
public slots:myslot01();
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);setWindowTitle("QT4连接信号与槽的写法");setFixedSize(800,600);QPushButton *btn = new QPushButton("QT4",this);btn->resize(300,50);//QT4写法//connect(btn, SIGNAL(clicked(bool)), this, SLOT(myslot01()));//QT5的写法//connect(btn,QPushButton::clicked,this,Widget::myslot01);//lambda表达式//语法:[...](形参列表){函数体};
//    connect(btn,QPushButton::clicked,[](){
//        qDebug() << "Lambda函数" << endl;
//    });//    int num = 10;
//    //=,可以访问外部变量,但是不能修改
//    connect(btn,QPushButton::clicked,[=](){
//        qDebug() << "Lambda函数" << num << endl;
//    });//    int x = 11;
//    int y = 22;
//    //能对lambda外的x,y变量只读操作,修改会报错
//    connect(btn,QPushButton::clicked, [x, y](){
//        qDebug() << "Lambda函数" << x << endl;
//        qDebug() << "Lambda函数" << y << endl;
//    });//局部变量,可以修改, 访问是随机值,因为这块代码结束局部变量会弹栈销毁,//所以要声明成全局变量或者用static修饰//此处为全局变量,访问全局变量用this,用static修饰时,[]中为[&m, &n]即可。m = 11;n = 22;connect(btn,QPushButton::clicked,[this](){qDebug() << "Lambda函数" << m << endl;qDebug() << "Lambda函数" << n << endl;m = 111;n = 222;qDebug() << "Lambda函数" << n << endl;qDebug() << "Lambda函数" << n << endl;});
}Widget::~Widget()
{delete ui;
}Widget::myslot01()
{qDebug() << "slot01" << endl;
}

结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023 IoTDB Summit:清华大学软件学院长聘副教授龙明盛《IoTDB 新组件:内生机器学习》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

安全狗入选“2023年福建省信息技术应用创新解决方案”名单

近日&#xff0c;福建省数字福建建设领导小组办公室公布了2023年福建省信息技术应用创新解决方案入选项目名单。 作为国内云原生安全领导厂商&#xff0c;安全狗凭借综合且具备突出创新水平的方案入选。 据悉&#xff0c;此次方案征集面向全省信创企业和用户单位&#xff0c;…

HarmonyOS4.0系统性深入开发14AbilityStage组件容器

AbilityStage组件容器 AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 AbilityStage与Module一一对应&#xff0c;即一个Module拥有一个AbilityStage。 DevEco Studio默…

勒索事件急剧增长,亚信安全发布《勒索家族和勒索事件监控报告》

近期(12.15-12.21)态势快速感知 近期全球共发生了247起攻击和勒索事件&#xff0c;勒索事件数量急剧增长。 近期需要重点关注的除了仍然流行的勒索家族lockbit3以外&#xff0c;还有本周top1勒索组织toufan。toufan是一个新兴勒索组织&#xff0c;本周共发起了108起勒索攻击&a…

电脑视频需要分屏怎么做

在当今数字时代&#xff0c;人们对于视频的需求越来越高。有时候&#xff0c;我们可能想在同一屏幕上同时播放多个视频&#xff0c;进行对比、观看、剪辑或者其他目的。那么&#xff0c;视频分屏应该怎么做呢&#xff1f; 在本篇文章中&#xff0c;我们将会详细的为你介绍视频分…

JS中模块的导入导出

背景 学习js过程中&#xff0c;发现导入导出有的是使用的export 导出&#xff0c;import导入&#xff0c;有的是使用exports或module.exports导出&#xff0c;使用require导入&#xff0c;不清楚使用场景和规则&#xff0c;比较混乱。 经过了解发现&#xff0c;NodeJS 中&…

JAVA基础学习笔记-day13-数据结构与集合源1

JAVA基础学习笔记-day13-数据结构与集合源1 1. 数据结构剖析1.1 研究对象一&#xff1a;数据间逻辑关系1.2 研究对象二&#xff1a;数据的存储结构&#xff08;或物理结构&#xff09;1.3 研究对象三&#xff1a;运算结构1.4 小结 2. 一维数组2.1 数组的特点 3. 链表3.1 链表的…

CSS免费在线字体格式转换器 CSS @font-face 生成器

今天竟意外发现的一款免费的“网页字体生成器”&#xff0c;功能强大又好用~ 工具地址&#xff1a;https://transfonter.org/ 根据你设置生成后的文件预览&#xff1a; 支持TTF、OTF、WOFF、WOFF2 或 SVG字体格式转换生成&#xff0c;每个文件最大15MB。转换完成以后还会生成一…

Spring Security 6.x 系列(14)—— 会话管理之源码分析

一、前言 在上篇 Spring Security 6.x 系列(13)—— 会话管理之会话概念及常用配置 Spring Security 6.x 系列(14)—— 会话管理之会话固定攻击防护及Session共享 中了清晰了协议和会话的概念、对 Spring Security 中的常用会话配置进行了说明,并了解会话固定攻击防护…

代表团坐车 - 华为OD统一考试

OD统一考试(B卷) 分值: 100分 题解: Java / Python / C++ 题目描述 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案输出方案数量。 约束: 一个团只能上一辆车,并且代表团…

广播及代码实现

广播&#xff08;Broadcast&#xff09;是一种网络通信方式&#xff0c;它允许一台设备向网络中的所有其他设备发送消息。广播通常用于在网络上传递一些信息&#xff0c;让所有设备都能接收并处理。在广播中&#xff0c;通信的目标是整个网络而不是特定的单个设备。 向子网中…

[嵌入式AI从0开始到入土]9_yolov5在昇腾上推理

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

力扣刷题-二叉树-构建树

106.从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7] 后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&#xff1a; 思路 参考&#xff1a;…

AI:112-基于卷积神经网络的美食图片识别与菜谱推荐

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

python包chromadb安装失败总结

1&#xff0c;背景&#xff1a; 最近在学习langchain的课程&#xff0c;里面创建自己的知识库的Retrieval模块中&#xff0c;需要用到向量数据库。 所以按照官方的教程&#xff08;vectorstores&#xff09;&#xff0c;准备使用chroma的向量数据库。图片来源 2&#xff0c;问…

HCIA-Datacom题库(自己整理分类的)——其他网络协议【完】

&#xff08;一&#xff09;单选 下列属于链路状态协议的是? Direct static FTP OSPF 解析&#xff1a; FTP&#xff1a;文件传输协议 OSPF&#xff1a;链路状态路由协议 如下图所示的网络主机A通过Telnet登录到路由器A然后在远程的界面通过FTP获取路由器的配置文件&…

APache 网页优化

技能目标&#xff1a; 掌握 Apache 网页压缩 掌握 Apache 网页缓存 掌握 Apache 网页防盗链 掌握 Apache 隐藏版本信息 4.1 网页压缩与缓存 在使用 Apache 作为 Web 服务器的过程中&#xff0c;只有对 Apache 服务器进行适当的优化配 置&…

Go 编程必备:bufio 库的全面指南与实战技巧

Go 编程必备&#xff1a;bufio 库的全面指南与实战技巧 引言bufio 库概览bufio.Readerbufio.Writerbufio.Scanner 深入 bufio.Readerbufio.Reader 的基本使用高级功能应用场景 探索 bufio.Writerbufio.Writer 的基本使用高级功能应用场景 运用 bufio.Scannerbufio.Scanner 的基…

前端开发个人简历范本(2024最新版-附模板)

前端开发工程师个人简历范本> 年龄 25岁 性别 男 毕业院校 XX大学 张三 学历 邮箱 leeywai-tools.cn 本科 专业 计算机科学与技术 个人梗概 拥有扎实的前端开发技能和丰富的实践经验 善于与团队合作&#xff0c;适应能力强&#xff0c;能够快速融入团队并贡献自…

独立看门狗与窗口看门狗

一、简介 STM32F10xxx内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障&#xff1b;当计数器达到给定的超时值时&#xff0c;触发一个中断(仅适用于窗口型看门狗)或产…