Qt 窗口的尺寸

本文通过多个案例,详细说明关于Qt窗体尺寸的一些重要问题

默认尺寸

对于一个Qt的窗口(继承于QWidget),获取其窗体尺寸的方法size();

以一个Qt创建Qt Widgets Application项目的默认生成代码为基础,做如下测试

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(1200,800);
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
}

第一个this->size()输出QSize(640, 480),即MainWindow具有默认的尺寸640*480

第二个this->size()输出QSize(1200, 800)

实际上,继承于QWidget的控件,例如QPushButton,QLineEdit等也会获得默认的尺寸640*480

    QWidget* page=new QWidget;
    qDebug()<<".."<<page->size();
    QPushButton* btn=new QPushButton;
    qDebug()<<".."<<btn->size();
    QLineEdit* edt=new QLineEdit;
    qDebug()<<".."<<edt->size();

以上输出都是QSize(640, 480)

布局之后的尺寸
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(1200,800);
    QWidget* page=new QWidget;
    qDebug()<<".."<<page->size();
    QVBoxLayout* layout=new QVBoxLayout(page);
    QPushButton* btn=new QPushButton;
    qDebug()<<".."<<btn->size();
    QLineEdit* edt=new QLineEdit;
    qDebug()<<".."<<edt->size();

    layout->addWidget(btn);
    layout->addWidget(edt);

    this->setCentralWidget(page);

    qDebug()<<".."<<page->size();
    qDebug()<<".."<<btn->size();
    qDebug()<<".."<<edt->size();
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    //当界面显示出来之后,点击按钮查看控件尺寸
    connect(btn,&QPushButton::clicked,[=]{
        qDebug()<<".."<<page->size();
        qDebug()<<".."<<btn->size();
        qDebug()<<".."<<edt->size();
    });
}

以上代码this->setCentralWidget(page);之后的三个打印对应的尺寸应该是多少?

依然还是 QSize(640, 480)

而connect()方法中的三个打印对应的值则分别为

.. QSize(1200, 800)
.. QSize(1178, 28)
.. QSize(1178, 24)

以上代码说明两个问题:

(1)将控件加入到布局,然后放入了父窗体中,则控件的尺寸会根据父窗体的布局重新设置

(2)控件尺寸的重新设置发生在窗体显示出来后(绘制时)

 固定尺寸

 以下代码实现在主窗体上布局多个按钮和子窗体,实现点击按钮切换每个子窗体的隐藏和可见。

但是存在问题:

(1)4个子窗体平分了主窗体的尺寸;

(2)隐藏一个子窗体后,其他的子窗体尺寸被更改(窗体重绘时会重新设置尺寸)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(1200,800);

    QWidget* page=new QWidget;
    QVBoxLayout* layout=new QVBoxLayout(page);

    QScrollArea* contentArea=new QScrollArea;
    contentArea->setWidgetResizable(true);
    contentArea->setWidget(page);

    for(int i=0;i<4;i++)
    {
        QWidget* p=new QWidget;
        //设置窗体背景色,使得区分背景,可见
        p->setStyleSheet("background-color:green");
        QPushButton* b=new QPushButton;
        layout->addWidget(b);
        layout->addWidget(p);
        connect(b,&QPushButton::clicked,[p]{
            //点击按钮后窗体切换显示和隐藏效果
            p->setVisible(!p->isVisible());
        });
    }
    this->setCentralWidget(contentArea);
}

如果需要设置子窗体在重绘时不改变尺寸,那么需要设置其尺寸

例如在QWidget* p=new QWidget;下方增加 p->setFixedHeight(300);

这样隐藏和显示一个子窗体不会对任意其他的子窗体的尺寸造成影响。

更改后会发现,当隐藏完所有的子窗体后,所有的按钮被均匀布局在了主窗体,如果想要的效果是按钮从主窗体从上往下紧密排列,可以在layout添加完所有的控件和窗口后,添加一个stretch,即在this->setCentralWidget(contentArea);上一行添加layout->addStretch();

窗体实际尺寸

如果MainWindow设置的高度为600,而它的中心窗体高度为800,该怎样显示?

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(800,600);
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    //默认情况下MainWindow没有centralWidget
    QWidget* center=new QWidget;
    qDebug()<<"center:"<<center->size();
    QVBoxLayout* layout=new QVBoxLayout(center);
    QWidget* page1=new QWidget;
    page1->setStyleSheet("background-color:green");
    page1->setFixedHeight(400);
    QWidget* page2=new QWidget;
    page2->setFixedHeight(400);
    page2->setStyleSheet("background-color:yellow");
    layout->addWidget(page1);
    layout->addWidget(page2);
    qDebug()<<"center:"<<center->size();
    this->setCentralWidget(center);
    //此时输出QSize(800, 600)
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    qDebug()<<"w size:"<<w.size();
    return a.exec();
}

以上代码执行时,MainWindow构造函数中的输出mainwindow的窗体高度为600,但是在窗口显示(执行了w.show())之后,它的高度却是829

给窗体设置某个尺寸,实际显示的时候窗体根据布局,不一定恰好按照给定的尺寸来显示

尺寸不够引起重叠的窗体

如果主窗体设置了固定高度600,而它的中心窗体设置固定高度1200?

此时,肯定主窗体显示不全page1和page2

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    this->resize(800,600);
    this->setFixedHeight(600);
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    //默认情况下MainWindow没有centralWidget
    QWidget* center=new QWidget;
    center->resize(800,500);
    qDebug()<<"center:"<<center->size();
    QVBoxLayout* layout=new QVBoxLayout(center);
    QWidget* page1=new QWidget;
    page1->setStyleSheet("background-color:green");
    page1->setFixedHeight(600);
    QWidget* page2=new QWidget;
    page2->setFixedHeight(600);
    page2->setStyleSheet("background-color:yellow");
    layout->addWidget(page1);
    layout->addWidget(page2);
    qDebug()<<"center:"<<center->size();
    this->setCentralWidget(center);
    //此时输出QSize(800, 600)
    qDebug()<<"MainWindow::MainWindow:"<<this->size();
    QTimer::singleShot(1000,[=](){
        //为什么page1和page2的高度是600,而实际显示的界面没有600?
        //事实上page1和page2的高度都是600,界面上也是600,但是page1和page2重叠了一部分
        qDebug()<<"page1:"<<page1->size();
        qDebug()<<"page2:"<<page2->size();
        qDebug()<<"center:"<<center->size();
        qDebug()<<"sizeHint:"<<layout->sizeHint();
        qDebug()<<"MainWindow::MainWindow:"<<this->size();
    });
}

这里输出了layout的sizeHit(),为1229,layout上放置了page1和page2,他们的高度600+600=1200,29是布局周边留下的空白部分。

最小高度限制

这里展示了一个实际项目中遇到的问题,需要在一个页面中放置多个表格,并且每个表格要直接显示至少5行,更多行的时候滚动条显示。

以下代码是从项目中抽取的问题特征部分:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(800,600);
    QWidget* page=new QWidget;
    QVBoxLayout* layout=new QVBoxLayout(page);

    QScrollArea* contentArea=new QScrollArea;
    contentArea->setWidgetResizable(true);
    contentArea->setWidget(page);

    for(int i=0;i<4;i++)
    {
        TableWidget* p=new TableWidget;
        QPushButton* b=new QPushButton;
        layout->addWidget(b);
        layout->addWidget(p);
        connect(b,&QPushButton::clicked,[p]{
            //点击按钮后窗体切换显示和隐藏效果
            p->setVisible(!p->isVisible());
            qDebug()<<"p size:"<<p->size();
        });
    }
    layout->addStretch();
    this->setCentralWidget(contentArea);
}

 TableWidget只是一个平凡的QTableWidget实例,它设置了默认表格有6行8列,

TableWidget::TableWidget()
{
    this->setRowCount(6);
    this->setColumnCount(8);
}

上述代码的效果:

目前的问题是每个表格高度都被挤压了,只显示了一行。

一种解决问题的思路是,在表格初始化时,设置最小高度限制:

TableWidget::TableWidget()
{
    this->setMinimumHeight(250);
    this->setRowCount(6);
    this->setColumnCount(8);
}

 一个更复杂的示例

以下是一个更复杂一些的示例,这个示例有助于理解Qt在布局控件的过程中对尺寸的更改。

代码目的是在主界面上加载多个Drawer页面,Drawer页面是一种类似抽屉的盒子,可以打开关闭(显示隐藏)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(800,600);
    QWidget* page=new QWidget;
    page->setMinimumHeight(1000);
    //layout用来装载drawer
    QVBoxLayout* layout=new QVBoxLayout(page);
    Drawer* d1=new Drawer;
    Drawer* d2=new Drawer;
    Drawer* d3=new Drawer;
    Drawer* d4=new Drawer;
    QList<Drawer*> drawers{d1,d2,d3,d4};
    for(int i=0;i<1;i++)
    {
        QVBoxLayout* lay=new QVBoxLayout;
        lay->addWidget(new QLineEdit);
        lay->addWidget(new QLineEdit);
        lay->addWidget(new QLineEdit);
        lay->addWidget(new QLineEdit);
        lay->addStretch();
        drawers.at(i)->setContentLayout(lay);
    }

    for(int i=1;i<4;i++)
    {
        QVBoxLayout* lay=new QVBoxLayout;
        lay->addWidget(new TableWidget);
        drawers.at(i)->setContentLayout(lay);
    }


    //以下的stretch使得drawer可以往页面上面顶
    for(int i=0;i<4;i++)
        layout->addWidget(drawers.at(i));

    layout->addStretch();


    QScrollArea* contentArea=new QScrollArea;
    contentArea->setWidgetResizable(true);
    contentArea->setWidget(page);

    this->setCentralWidget(contentArea);


    QTimer::singleShot(1000,[=](){
        qDebug()<<"MainWindow::MainWindow:"<<this->size()<<","<<this->sizeHint();
        qDebug()<<"d2:size:"<<d2->size()<<","<<d2->sizeHint();
    });

}

 Drawer提供一个按钮,用于交互显示隐藏页面,和一个接口用于设置页面显示的内容(设置一个布局)

Drawer::Drawer(QWidget *parent)
    : QWidget{parent}
{
    QVBoxLayout* layout=new QVBoxLayout;
    layout->addSpacing(0);
    layout->setContentsMargins(0,0,0,0);
    QToolButton* btn=new QToolButton;
    layout->addWidget(btn);
    area=new QScrollArea;
    area->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    layout->addWidget(area);
    this->setLayout(layout);
    connect(btn,&QToolButton::clicked,[=]{
        area->setVisible(!area->isVisible());
        qDebug()<<"drawer size:"<<this->size()<<this->minimumHeight();
//        if(!area->isVisible())
//        {
//            this->setFixedHeight(30);
//        }
//        else
//        {
//            this->setFixedHeight(minHeight);
//        }
    });
}

void Drawer::setContentLayout(QLayout *lay)
{
    area->setLayout(lay);
//    minHeight=this->minimumHeight();
}

 其中TableWidget依然是QTableWidget的简单实例

TableWidget::TableWidget()
{
    this->setRowCount(6);
    this->setColumnCount(8);
}

以上代码的效果如下:

存在的问题是:

(1)表格默认只展示了两行,

(2)并且关闭了一个Drawer后,其他Drawer的尺寸会发生变化

其中,前面对(2)问题的处理是设置固定的尺寸p->setFixedHeight(300);

对应这里就是在Drawer的构造函数第一行加 this->setFixedHeight(300);但是这样一来,会发现每个Drawer之间重叠了,就是尺寸不够引起了窗体重叠,300*400=1200>1000,主窗体中的滚动区域的窗体设置的最小高度1000.

另外隐藏所有的Drawer页面后,剩余的按钮又均匀分布在了主界面。

这里的效果和前面固定尺寸一节遇到的问题看似相同,而实际上却不一样,前面的问题通过在布局的最后增加stretch解决,这里显然不能。

这里遇到的问题是由于按钮点击后隐藏的不是整个Drawer,而只是Drawer中的area,Drawer依然是可见的,因此处于整个主界面的布局之中。这里当Drawer中的area被隐藏后,Drawer页面本身被重新布局了,即只有一个QToolButton参与了布局,所以能看到按钮被布局在了Drawer的中央。

那么,这种情况下该怎样实现效果:

(1)隐藏所有的Drawer的area后,只剩下按钮顶格显示在主页面

(2)表格默认显示至少5行

(3)隐藏一个Drawer不会对其他的Drawer尺寸产生影响

一种方式是要在Drawer显示隐藏切换的时候同时设置固定的尺寸;这个固定的尺寸要使得表格至少显示5行

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(800,600);
    QWidget* page=new QWidget;
    //给page设置了最小高度后,每个drawer的高度会高一些
    page->setMinimumHeight(1200);
    //layout用来装载drawer
    QVBoxLayout* layout=new QVBoxLayout(page);
    Drawer* d1=new Drawer;
    Drawer* d2=new Drawer;
    Drawer* d3=new Drawer;
    Drawer* d4=new Drawer;
    QList<Drawer*> drawers{d1,d2,d3,d4};
    for(int i=0;i<1;i++)
    {
        QVBoxLayout* lay=new QVBoxLayout;
        lay->addWidget(new QLineEdit);
        lay->addWidget(new QLineEdit);
        lay->addWidget(new QLineEdit);
        lay->addWidget(new QLineEdit);
        lay->addStretch();
        //需要提前设置Drawer的最小高度
        drawers.at(i)->setMinimumHeight(200);
        drawers.at(i)->setContentLayout(lay);
    }

    for(int i=1;i<4;i++)
    {
        QVBoxLayout* lay=new QVBoxLayout;
        lay->addWidget(new TableWidget);
        //需要提前设置Drawer的最小高度
        drawers.at(i)->setMinimumHeight(300);
        drawers.at(i)->setContentLayout(lay);
    }


    //以下的stretch使得drawer可以往页面上面顶
    for(int i=0;i<4;i++)
        layout->addWidget(drawers.at(i));

    layout->addStretch();


    QScrollArea* contentArea=new QScrollArea;
    contentArea->setWidgetResizable(true);
    contentArea->setWidget(page);

    this->setCentralWidget(contentArea);


    QTimer::singleShot(1000,[=](){
        qDebug()<<"MainWindow::MainWindow:"<<this->size()<<","<<this->sizeHint();
        qDebug()<<"d2:size:"<<d2->size()<<","<<d2->sizeHint();
    });

}
TableWidget::TableWidget()
{
    this->setRowCount(6);
    this->setColumnCount(8);
}
Drawer::Drawer(QWidget *parent)
    : QWidget{parent}
{
    QVBoxLayout* layout=new QVBoxLayout;
    layout->addSpacing(0);
    layout->setContentsMargins(0,0,0,0);
    QToolButton* btn=new QToolButton;
    layout->addWidget(btn);
    area=new QScrollArea;
    area->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    layout->addWidget(area);
    this->setLayout(layout);
    connect(btn,&QToolButton::clicked,[=]{
        area->setVisible(!area->isVisible());
        qDebug()<<"drawer size:"<<this->size()<<this->minimumHeight();
        //这里根据area显示和隐藏的状态动态调整整个drawer的高度
        if(!area->isVisible())
        {
            this->setFixedHeight(30);
        }
        else
        {
            this->setFixedHeight(minHeight);
        }
    });
}

void Drawer::setContentLayout(QLayout *lay)
{
    area->setLayout(lay);
    //这里将预设的最小高度记录下来,用于在area显示隐藏切换时设置drawer的高度
    minHeight=this->minimumHeight();
}

以上代码的效果如下:

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

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

相关文章

实现基于 Jenkins 的多服务器打包方案

实现基于 Jenkins 的多服务器打包方案 在实际项目中&#xff0c;我们经常会遇到需要将一个应用程序或服务部署到不同的服务器上的需求。而使用 Jenkins 可以很方便地自动化这个过程。 设置参数 首先&#xff0c;我们需要设置一些参数&#xff0c;以便在构建过程中指定要部署…

Element UI + Vue 新增和编辑共用表单校验无法清除问题(已解决)

问题描述 在新增和编辑过程中大部分情况下 两个表单是一致的&#xff0c;而且编辑也有回显需要&#xff0c;所有绝大多数情况下 都是一个表单两个用处&#xff0c;但是随之而来出现了一个无法清除校验的问题&#xff0c;在先点击编辑后再点击新增会出现校验红字&#xff1a; …

防止消息丢失与消息重复——Kafka可靠性分析及优化实践

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

【Linux】进程优先级|进程并发概念|在vim中批量化注释

文章目录 前言tips——如何在vim中批量化注释进程更深度理解一、什么是进程优先级二、 为什么要有优先级三、Linux怎么设置优先级查看进程优先级的命令PRI and NI用top命令更改已存在进程的nice&#xff1a; 如何根据优先级开展调度呢&#xff1f;五、其他概念并发&#xff08;…

css四种导入方式

1 行内样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <h1 style"color: blue">我是标题</h1> </body> </htm…

【Objective-C】浅析Block及其捕获机制

目录 Block的基本使用Block的声明Block的实现Block的调用 Block作为形参使用Block作为属性使用给Block起别名Block的copy Block的捕获机制auto类型的局部变量__block浅析static类型的局部变量全局变量 其他问题 Block的基本使用 什么是Block&#xff1f; Block &#xff08;块…

超市商品管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL

项目下载地址 目录 项目下载地址 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4…

【嵌入式开发学习】__单片机中容易造成内存泄露的几个痛点

目录 前言 一、程序运行 二、什么是内存泄露&#xff1f; 三、内存泄露的严重后果&#xff01; 四、如何定位到泄露的要点&#xff1f; 五、三大痛点 1. 访问越界 2. 栈 3. 堆 六、泄露常见的场景 1. 重新赋值 2. 首先释放父块 3. 返回值的不正确处理 七、常见的…

Azure - 机器学习:创建机器学习所需资源,配置工作区

目录 一、Azure机器学习工作区与计算实例简要介绍工作区计算实例 二、创建工作区1. 登录到 Azure 机器学习工作室2. 选择“创建工作区”3. 提供以下信息来配置新工作区&#xff1a;4. 选择“创建”以创建工作区 三、创建计算实例四、工作室实战4.1 工作室快速导览4.2 从示例笔记…

常用linux命令 linux_cmd_sheet

查看文件大小 ls -al 显示每个文件的kb大小 查看系统日志 dmesg -T | tail 在 top 命令中&#xff0c;RES 和 VIRT&#xff08;或者 total-vm&#xff09;是用来表示进程内存使用的两个不同指标&#xff0c;它们之间有以下区别&#xff1a; RES&#xff08;Resident Set Size…

TWAS模型数据*.wgt.RDat查看及导入R

TWAS模型数据*.wgt.RDat查看及导入R 1 数据导入R load(“./SLC7A8.wgt.RDat”) as.data.frame(snps) -> snp snp %>% head()V1 V2 V3 V4 V5 V6 1 12 rs10747759 0 55683634 C T 2 12 rs2293409 0 55684180 A C 3 12 rs1048103 0 55684405 C …

Pytorch代码入门学习之分类任务(二):定义数据集

一、导包 import torch import torchvision import torchvision.transforms as transforms 二、下载数据集 2.1 代码展示 # 定义数据加载进来后的初始化操作&#xff1a; transform transforms.Compose([# 张量转换&#xff1a;transforms.ToTensor(),# 归一化操作&#x…

FLStudio2024汉化破解版在哪可以下载?

水果音乐制作软件FLStudio是一款功能强大的音乐创作软件,全名:Fruity Loops Studio。水果音乐制作软件FLStudio内含教程、软件、素材,是一个完整的软件音乐制作环境或数字音频工作站... FL Studio21简称FL 21&#xff0c;全称 Fruity Loops Studio 21&#xff0c;因此国人习惯叫…

图像数据噪音种类以及Python生成对应噪音

前言 当涉及到图像处理和计算机视觉任务时&#xff0c;噪音是一个不可忽视的因素。噪音可以由多种因素引起&#xff0c;如传感器误差、通信干扰、环境光线变化等。这些噪音会导致图像质量下降&#xff0c;从而影响到后续的图像分析和处理过程。因此&#xff0c;对于从图像中获…

0027Java程序设计-房屋出租管理系统

文章目录 摘 要目 录系统设计开发环境 摘 要 随着我国市场经济的快速发展和人们生活水平的不断提高&#xff0c;简单的房屋出租服务已经不能满足人们的需求。如何利用先进的管理手段&#xff0c;提高房屋出租的管理水平&#xff0c;是当今社会所面临的一个重要课题。 本文采用…

I/O 模型学习笔记【全面理解BIO/NIO/AIO】

文章目录 I/O 模型什么是 I/O 模型Java支持3种I/O模型BIO&#xff08;Blocking I/O&#xff09;NIO&#xff08;Non-blocking I/O&#xff09;AIO&#xff08;Asynchronous I/O&#xff09; BIO、NIO、AIO适用场景分析 java BIOJava BIO 基本介绍Java BIO 编程流程一个栗子实现…

【2024秋招】小米中间件后端开发一面2023-9-13-base武汉

1 自我介绍 2 快手实习 2.1 讲讲你写的curd启动器&#xff0c;做了哪些工作呢 答&#xff1a; 2.2 网上也有一些开源的curd代码生成器&#xff0c;你为什么需要自研呢&#xff08;重要&#xff09; 答&#xff1a; &#xff08;1&#xff09;这个必须得自研&#xff0c;因…

『第三章』雨燕栖息地:Swift 开发环境

在本篇博文中,您将学到如下内容: 1. Swift 开发平台2. Swift 集成开发环境 Xcode&#xff1f;3. 原型试验场&#xff1a;Playground4. 另一种尝试&#xff1a;iPad 上的 Swift Playgrounds5. Swift 交互实验室&#xff1a;Swift REPL总结 咫尺春三月&#xff0c;寻常百姓家。为…

【RTOS学习】软件定时器 | 中断处理

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 软件定时器 | 中断处理 &#x1f3c0;软件定时器⚽守护任务守护任务的调度 ⚽使用软件定时器的函数…

多级缓存入门

文章目录 什么是多级缓存JVM进程缓存环境准备安装MySQL导入Demo工程导入商品查询页面 初识Caffeine Lua语法初识Lua第一个lua程序变量和循环Lua的数据类型声明变量循环 条件控制、函数函数条件控制 多级缓存安装OpenRestyOpenResty快速入门反向代理流程OpenResty监听请求编写it…