Qt_窗口界面QMainWindow的介绍

目录

1、菜单栏QMenuBar

1.1 使用QMainWindow的准备工作 

1.2 在ui文件中设计窗口 

1.3 在代码中设计窗口

1.4 实现点击菜单项的反馈

1.5 菜单中设置快捷键

1.6 菜单中添加子菜单

1.7 菜单项中添加分割线和图标 

1.8 关于菜单栏创建方式的讨论 

2、工具栏QToolBar 

2.1 创建工具栏

2.2 设置工具项图标 

2.3 设置工具栏的停靠位置

2.4 设置浮动、移动属性 

3、状态栏QStatusBar 

3.1 显示临时消息         

3.2 显示永久消息 

4、浮动窗口QDockWidget 

4.1 设置停靠位置

结语 


前言:

        Qt的窗口界面是通过QMainWindow类实现的,该类继承自QWidget。相比于QWidget,QMainWindow生成的界面更像是一个窗口,因为该界面的布局已经设置好了,分成五个部分:1、⼀个菜单栏(menu bar),2、多个工具栏(tool bars),3、多个浮动窗⼝(dock widgets),4、⼀个状态栏(status bar) ,5、 中心部件(central widget)。开发者只需要在这框架中加入相关控件就能构建出一个窗口了。QMainWindow窗口界面示意图如下:

        由于中心部件就是QWidget控件本身,而QWidget的作用就是接纳各种控件,本质上和新建一个QWidget项目的使用逻辑是一样的(关于QWidget请看:Qt_QWidget的基本使用),因此下文就不再描述中心部件的使用了。

1、菜单栏QMenuBar

        Qt中的菜单栏是通过QMenuBar类来实现的,⼀个主窗⼝最多只有⼀个菜单栏,位于窗口标题栏下⾯。其中菜单栏中可以有多个菜单,而菜单下可以有多个项目,当然菜单里也可以有子菜单,他们的关系如下图:

        菜单栏的类是QMenuBar,菜单的类是QMenu,菜单项的类是QAction(此处菜单项实际上就是一个项目,只不过该项目在菜单中,因此叫做菜单项)。

1.1 使用QMainWindow的准备工作 

        在使用QMainWindow前,必须要在Qt创建QMainWindow项目,步骤很简单,在新建项目后选择界面类的信息时选择QMainWindow即可,如下图:


        后续一直点击下一步就能够自动生成相关文件和代码,如下图: 

        关于这里的代码和文件的含义可以移步至此处了解:Qt中QWidget的创建和使用,此处的代码和文件只不过将QWidget换成了QMainWindow,使用原则都是一样的。

1.2 在ui文件中设计窗口 

        可以在ui文件中对QMainWindow做一些设计,这种方式简单明了,能够直接观察出效果,效果图如下:

        运行结果:

1.3 在代码中设计窗口

        除了直接在ui文件中设计窗口,还可以用代码的形式来设计窗口,首先new一个QMenuBar,然后将该QMenuBar通过调用setMenuBar接口设置到当前的窗口中,在MainWindow.cpp下实现代码,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建菜单栏QMenuBar* menubar = new QMenuBar(this);this->setMenuBar(menubar);//设置到当前的窗口中//添加菜单,菜单的类是QMenuQMenu* menu1 = new QMenu("保存",this);QMenu* menu2= new QMenu("编辑",this);menubar->addMenu(menu1);menubar->addMenu(menu2);//添加项目至菜单中QAction* action1 = new QAction("菜单项1");QAction* action2 = new QAction("菜单项2");menu1->addAction(action1);menu1->addAction(action2);
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

1.4 实现点击菜单项的反馈

        在正常的窗口使用中,往往是点击一个菜单项后会得到相应的反馈,这需要绑定菜单项的信号与槽,这里简单的模拟该反馈,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建菜单栏QMenuBar* menubar = new QMenuBar(this);this->setMenuBar(menubar);//添加菜单,菜单的类是QMenuQMenu* menu1 = new QMenu("保存",this);QMenu* menu2= new QMenu("编辑",this);menubar->addMenu(menu1);menubar->addMenu(menu2);//添加项目至菜单中QAction* action1 = new QAction("菜单项1");QAction* action2 = new QAction("菜单项2");menu1->addAction(action1);menu1->addAction(action2);//实现菜单项的信号,在MainWindow.h头文件中声明了QAction_tri函数connect(action1,&QAction::triggered,this,&MainWindow::QAction_tri);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::QAction_tri()
{qDebug()<<"实现菜单项1的功能";
}

        运行结果:

1.5 菜单中设置快捷键

        给菜单以及菜单项设置快捷键(通过&+“字母”的方式),并通过键盘上的Alt+“字母”点击菜单项,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建菜单栏QMenuBar* menubar = new QMenuBar(this);this->setMenuBar(menubar);//添加菜单,菜单的类是QMenuQMenu* menu1 = new QMenu("保存 (&A)",this);QMenu* menu2= new QMenu("编辑 (&F)",this);menubar->addMenu(menu1);menubar->addMenu(menu2);//添加项目至菜单中QAction* action1 = new QAction("菜单项1 (&C)");QAction* action2 = new QAction("菜单项2 (&B)");menu1->addAction(action1);menu1->addAction(action2);//实现菜单项的信号connect(action1,&QAction::triggered,this,&MainWindow::QAction_tri);connect(action2,&QAction::triggered,this,&MainWindow::QAction_tri2);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::QAction_tri()
{qDebug()<<"实现菜单项1的功能";
}void MainWindow::QAction_tri2()
{qDebug()<<"实现菜单项2的功能";
}

        运行结果:

1.6 菜单中添加子菜单

        菜单里除了可以有菜单项,还可以存放子菜单,在上述构造函数代码中添加代码:

    //子菜单QMenu* menu_child= new QMenu("子菜单",this);menu1->addMenu(menu_child);//子菜单添加项目menu_child->addAction(action1);

         运行结果:

1.7 菜单项中添加分割线和图标 

         可以给菜单项添加分割线来区别彼此,添加分割线的代码很简单,让菜单调用addSeparator函数即可,不过添加分割线一定会在该菜单的末尾处添加,因此要注意添加顺序,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建菜单栏QMenuBar* menubar = new QMenuBar(this);this->setMenuBar(menubar);//添加菜单,菜单的类是QMenuQMenu* menu1 = new QMenu("保存 (&A)",this);QMenu* menu2= new QMenu("编辑 (&F)",this);menubar->addMenu(menu1);menubar->addMenu(menu2);//添加项目至菜单中QAction* action1 = new QAction("菜单项1 (&C)");QAction* action2 = new QAction("菜单项2 (&B)");menu1->addAction(action1);menu1->addSeparator();//添加分割线menu1->addAction(action2);
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:


        调用添加图标的接口setIcon即可完成图标的添加,不仅菜单项能够添加,菜单本身也可以添加,具体添加图标的细节请看Qt_控件的QWidget属性介绍,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建菜单栏QMenuBar* menubar = new QMenuBar(this);this->setMenuBar(menubar);//添加菜单,菜单的类是QMenuQMenu* menu1 = new QMenu("保存 (&A)",this);QMenu* menu2= new QMenu("编辑 (&F)",this);menubar->addMenu(menu1);menubar->addMenu(menu2);//添加项目至菜单中QAction* action1 = new QAction("菜单项1 (&C)");QAction* action2 = new QAction("菜单项2 (&B)");menu1->addAction(action1);menu1->addSeparator();//添加分割线menu1->addAction(action2);//添加图片action1->setIcon(QIcon(QPixmap(":/action1")));action2->setIcon(QIcon(QPixmap(":/action2")));
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

1.8 关于菜单栏创建方式的讨论 

        我们可以在ui文件的右上角看到关于QMainWindow的初始化状况:

        上述代码中使用菜单栏的方式是new一个QMenuBar,然后将该QMenuBar设置到当前窗口中。这么做会导致内存泄漏,因为在创建QMainWindow时,Qt会自动生成了一个QMenuBar,若我们自己再new一个QMenuBar,并对其调用setMenuBar接口,那么会导致旧的QMenuBar脱离Qt对象树,即旧的QMenuBar无法自动释放了从而导致内存泄漏。


        所以使用菜单栏QMenuBar时,推荐的做法是调用函数menuBar,该函数的作用是:1、如果QMenuBar已经存在,直接获取并返回。2、如果QMenuBar不存在,则会自动new一个新的,然后返回new出来的菜单栏。

        因此上述代码中创建菜单栏的推荐的代码为:

//创建菜单栏
//QMenuBar* menubar = new QMenuBar(this);
QMenuBar* menubar = this->menuBar();
this->setMenuBar(menubar);

        恒古不变的是都要调用setMenuBar将菜单栏设置到当前界面。 

2、工具栏QToolBar 

        工具栏跟菜单栏不一样,菜单栏是QMainWindow默认就有的,而工具栏是必须需要我们手动new的,并且菜单栏只能有一个,而工具栏可以有多个,并且工具栏默认是可以用鼠标拖动的。工具栏里存放的直接就是项目QAction,目的就是方便用户快速使用某个功能,通常这些项目以图标的形式存在。工具栏实物图如下:

2.1 创建工具栏

        先手动new出工具栏对象QToolBar,然后调用QMainWindow的addToolBar函数,将new出的对象作为该函数的实参,完成工具栏的创建和显示,并在工具栏中创建工具项,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建工具栏QToolBar* toolbar = new QToolBar(this);this->addToolBar(toolbar);//创建工具项QAction* action1 = new QAction("文件");QAction* action2 = new QAction("编辑");toolbar->addAction(action1);toolbar->addAction(action2);//连接工具项的信号与槽connect(action1,&QAction::triggered,this,&MainWindow::action2_tri1);connect(action2,&QAction::triggered,this,&MainWindow::action2_tri2);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::action2_tri1()
{qDebug()<<"文件";
}void MainWindow::action2_tri2()
{qDebug()<<"编辑";
}

        运行结果:

2.2 设置工具项图标 

         设置图标的逻辑和上述给菜单项设置图标的逻辑是一样的,只需要用工具项调用函数setIcon即可,不过对工具项设置图标后,会覆盖原先的文本内容,将原先的文本内容以鼠标停悬时的提示信息显示出来,代码如下:

//设置图标action1->setIcon(QIcon(":/action1"));action2->setIcon(QIcon(":/action2"));

        运行结果:


        也可以通过调用函数setToolTip自定义提示信息,代码如下:

//设置图标action1->setIcon(QIcon(":/action1"));//设置提示信息action1->setToolTip("这是一个文件");action2->setIcon(QIcon(":/action2"));

        运行结果:

2.3 设置工具栏的停靠位置

        工具栏默认停靠位置是在窗口的上方,位置设置有两个概念。⼀个是在添加⼯具栏调用addToolBar()的同时指定停靠的位置,另⼀种是在创建之后调用QToolBar类提供的setAllowedAreas()函数来设置允许停靠的位置。可以设置的位置如下:

• Qt::LeftToolBarArea 停靠在左侧

• Qt::RightToolBarArea 停靠在右侧

• Qt::TopToolBarArea 停靠在顶部

• Qt::BottomToolBarArea 停靠在底部

• Qt::AllToolBarAreas 以上四个位置都可停靠

        概念一,设置工具栏的初始位置,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建工具栏QToolBar* toolbar1 = new QToolBar(this);this->addToolBar(Qt::LeftToolBarArea,toolbar1);QToolBar* toolbar2 = new QToolBar(this);this->addToolBar(Qt::RightToolBarArea,toolbar2);}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:


        概念二,后续使用setAllowedAreas函数来设置允许停靠的位置,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建工具栏QToolBar* toolbar1 = new QToolBar(this);this->addToolBar(toolbar1);QToolBar* toolbar2 = new QToolBar(this);this->addToolBar(toolbar2);//只允许toolbar1停靠在左边,但是初始位置依然是在上方toolbar1->setAllowedAreas(Qt::LeftToolBarArea);//只允许toolbar1停靠在右边,但是初始位置依然是在上方toolbar2->setAllowedAreas(Qt::RightToolBarArea);}MainWindow::~MainWindow()
{delete ui;
}

         工具栏是可以拖动的,默认情况下工具栏可以停靠在上下左右四个位置,如果调用了setAllowedAreas,则说明工具栏的停靠位置受setAllowedAreas函数的限制了。

2.4 设置浮动、移动属性 

         通过调用函数setFloatable来设置工具栏的浮动属性,默认运行工具栏可以浮动,若调用setFloatable并传false则不允许浮动工具栏,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建工具栏QToolBar* toolbar1 = new QToolBar(this);this->addToolBar(toolbar1);//设置项目,方便观察运行效果QAction* action = new QAction("文件");toolbar1->addAction(action);//设置不可浮动toolbar1->setFloatable(false);
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

         此时工具栏虽然可以被移动,但是不能浮动在界面中的任意位置,只要鼠标松开,工具栏就会自动恢复到之前的位置。


        设置移动属性的逻辑和上述一样,通过QToolBar类提供的setMovable()函数来设置,默认可以移动,传false则不能移动。当工具栏不能移动时,意味着工具栏也不能浮动,并且工具栏的停靠位置也就无法改变了。代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建工具栏QToolBar* toolbar1 = new QToolBar(this);this->addToolBar(toolbar1);//设置项目,方便观察运行效果QAction* action = new QAction("文件");toolbar1->addAction(action);//设置不可浮动toolbar1->setFloatable(false);//设置不可移动toolbar1->setMovable(false);
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

3、状态栏QStatusBar 

        状态栏是界面中输出简要信息的区域,⼀般位于主窗口的最底部,⼀个窗口中最多只能有⼀个状态栏。在Qt中,状态栏是通过QStatusBar类来实现的。在状态栏中可以显示的消息类型有:

• 临时消息:如当前程序状态

• 永久消息:如程序版本号

• 进度消息:如进度条提示

        并且状态栏是QMainWindow中默认存在的,因此创建状态栏是无需用new的方式,而是调用statusBar()函数获取默认的状态栏。 

3.1 显示临时消息         

        调用函数showMessage来设置一个临时消息, 代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar* status = statusBar();status->showMessage("这是一个临时消息",3000);//3000ms = 3s}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

        该信息会在3秒后消失。 

3.2 显示永久消息 

        通过在状态栏中添加标签的方式来实现显示永久消息,因为标签中的文本内容是永久性的,代码如下: 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar* status = statusBar();//status->showMessage("这是一个临时消息",3000);//3000ms = 3sQLabel* label = new QLabel("这是一个永久消息");status->addWidget(label);//在状态栏右侧显示QLabel* label1 = new QLabel("这是一个右侧消息");status->addPermanentWidget(label1);}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

4、浮动窗口QDockWidget 

        有了上述浮动属性的概念,浮动窗口也就不难理解,他是一个窗口并且可以浮动在界面中的任意位置,并且也可以停靠在窗口四周。他的类是QDockWidget ,由于他不是QMainWindow默认就有的控件,因此需要我们手动new出来,然后调用addDockWidget函数将其置于当前窗口中。代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDockWidget>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QDockWidget* dock = new QDockWidget(this);addDockWidget(Qt::BottomDockWidgetArea,dock);//设置初始在底部}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

4.1 设置停靠位置

        这里的设置允许停靠的逻辑和工具栏的逻辑是一样的,也通过setAllowedAreas来进行设置,允许停靠的位置有:

• Qt::LeftDockWidgetArea 停靠在左侧

• Qt::RightDockWidgetArea 停靠在右侧

• Qt::TopDockWidgetArea 停靠在顶部

• Qt::BottomDockWidgetArea 停靠在底部

• Qt::AllDockWidgetAreas 以上四个位置都可停靠

        设置完成后,则浮动窗口只能在对应位置处停靠。 

结语 

        以上就是关于Qt窗口界面QMainWindow的介绍,QMainWindow相比于QWidget多了四个控件,这些控件都是组成窗口的重要部分,而且在实际运用中,窗口界面才是被运用的最多的,所以理解这四个控件尤为重要。

         最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!!

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

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

相关文章

谷歌-BERT-“bert-base-chinese ”

1 需求 需求&#xff1a;自动下载模型和分词器 需求&#xff1a;手动导入模型和分词器 需求&#xff1a;pipeline使用预训练模型 需求&#xff1a;训练和评估 需求&#xff1a;测试 关键词&#xff1a;训练数据集、评估数据集、测试数据集 需求&#xff1a;上线 2 接口 3 自…

[UTCTF2020]sstv

用goldwave和010editor打开均未发现线索&#xff0c; 网上搜索sstv&#xff0c;豆包回答如下&#xff1a; 慢扫描电视&#xff08;Slow Scan Television&#xff0c;简称 SSTV&#xff09;是一种通过无线电传输和接收静态图像的技术。 一、工作原理 SSTV 通过将图像逐行扫描并…

鸿蒙OpenHarmony【轻量系统内核通信机制(互斥锁)】子系统开发

互斥锁 基本概念 互斥锁又称互斥型信号量&#xff0c;是一种特殊的二值性信号量&#xff0c;用于实现对共享资源的独占式处理。 任意时刻互斥锁的状态只有两种&#xff0c;开锁或闭锁。当任务持有互斥锁时&#xff0c;该互斥锁处于闭锁状态&#xff0c;这个任务获得该互斥锁…

利用Metasploit进行信息收集与扫描

Metasploit之信息收集和扫描 在本文中&#xff0c;我们将学习以下内容 使用Metasploit被动收集信息 使用Metasploit主动收集信息 使用Nmap进行端口扫描 使用db_nmap方式进行端口扫描 使用ARP进行主机发现 UDP服务探测 SMB扫描和枚举 SSH版本扫描 FTP扫描 SMTP枚举 …

基于python上门维修预约服务数据分析系统

目录 技术栈和环境说明解决的思路具体实现截图python语言框架介绍技术路线性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示操作可行性详细视频演示源码获取 技术栈和环境说明 结合用户的使用需求&#xff0c;本系统采用运用较为广…

Git使用详解:从安装到精通

前言 什么是Git Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛使用。 可以理解&#xff1a; git是一个管理源代码的工具&#xff0c;主要用于企业团队开…

接口自动化框架入门(requests+pytest)

一、接口自动化概述 二、数据库概述 2.1 概念 存储数据的仓库&#xff0c;程序中数据的载体 2.2 分类 关系型数据库&#xff1a;安全 如mysql&#xff0c;oracle&#xff0c;SQLLite database tables 行列 非关系型数据库&#xff1a;高效 如redis&#xff0c;mongoDB 数…

学习大数据DAY59 全量抽取和增量抽取实战

目录 需求流程&#xff1a; 需求分析与规范 作业 作业2 需求流程&#xff1a; 全量抽取 增量抽取 - DataX Kettle Sqoop ... 场景: 业务部门同事或者甲方的工作人员给我们的部门经理和你提出了新的需 求 流程: 联系 > 开会讨论 > 确认需求 > 落地 需求文档( 具体…

4.提升客户服务体验:ChatGPT在客服中的应用(4/10)

本文大纲旨在指导撰写一篇全面探讨ChatGPT如何通过优化客户服务流程、提供实际应用案例和用户反馈&#xff0c;以提升客户服务体验的深入博客文章。 引言 在当今竞争激烈的商业环境中&#xff0c;客户服务已成为企业成功的关键因素。优质的客户服务不仅能够增强客户满意度和忠…

天池Fashion AI 比赛失败经历分享

关联比赛: FashionAI全球挑战赛—服饰关键点定位 昨天是天池Fashion AI初赛Deadline&#xff0c; 成绩出来复赛都没能进&#xff0c;虽然结果很遗憾&#xff0c;但在比赛的过程中也接触到了不少的新东西&#xff0c;希望能在这里把我尝试过的方法都分享出来。作为对自己的总结…

Why Is Prompt Tuning for Vision-Language Models Robust to Noisy Labels?

文章汇总 本文的作者针对了提示学习的结构设计进行了分析&#xff0c;发现了一些规律&#xff1a; 1)固定的类名令牌为模型的优化提供了强正则化&#xff0c;减少了由噪声样本引起的梯度。 2)从多样化和通用的web数据中学习到的强大的预训练图像文本嵌入为图像分类提供了强大…

基于kubernetes-nmstate配置节点网络

kubernetes-nmstate 简介 kubernetes-nmstate 通过 Kubernetes API 驱动的声明式节点网络配置。 随着混合云的出现&#xff0c;节点网络设置变得更加具有挑战性。不同的环境有不同的网络要求。 容器网络接口&#xff08;CNI&#xff09;标准实现了不同的解决方案&#xff0c;…

简单多状态dp第二弹 leetcode -删除并获得点数 -粉刷房子

740. 删除并获得点数 删除并获得点数 分析: 使用动态规划解决 这道题依旧是 打家劫舍I 问题的变型。 我们注意到题目描述&#xff0c;选择 x 数字的时候&#xff0c; x - 1 与 x 1 是不能被选择的。像不像 打家劫舍 问题中&#xff0c;选择 i 位置的金额之后&#xff0c;就不…

更高效的搜索工具,国内免费好用的AI智能搜索引擎工具

搜索引擎是我们获取信息的重要渠道&#xff0c;然而由于搜索引擎搜索结果存在较多的广告以及一些无关内容&#xff0c;这使我们的搜索效率变得更低效。小编就和大家分享几款国内免费好用的AI智能搜索工具&#xff0c;提高搜索效率。 1.开搜AI搜索 开搜AI搜索是一款基于深度学…

低版本SqlSugar的where条件中使用可空类型报语法错误

SQLServer数据表中有两列可空列&#xff0c;均为数值类型&#xff0c;同时在数据库中录入测试数据&#xff0c;Age和Height列均部分有值。   使用SqlSugar的DbFirst功能生成数据库表类&#xff0c;其中Age、Height属性均为可空类型。   开始使用的SqlSugar版本较低&…

Zabbix 6.4添加中文语言

/usr/share/zabbix/include/locales .inc .phplocale -agrep “zh_CN" yum install langpacks-zh_CN.noarch y y y

Linux | 探索 Linux 信号机制:信号的产生和自定义捕捉

信号是 Linux 操作系统中非常重要的进程控制机制&#xff0c;用来异步通知进程发生某种事件。理解信号的产生、阻塞、递达、捕捉等概念&#xff0c;可以帮助开发者更好地编写健壮的应用程序&#xff0c;避免由于未处理的信号导致程序异常退出。本文将带你从基础概念开始&#x…

利士策分享,自我和解:通往赚钱与内心富足的和谐之道

利士策分享&#xff0c;自我和解&#xff1a;通往赚钱与内心富足的和谐之道 在这个快节奏、高压力的时代&#xff0c;我们往往在追求物质财富的同时&#xff0c;忽略了内心世界的和谐与平衡。 赚钱&#xff0c;作为现代生活中不可或缺的一部分&#xff0c;它不仅仅是生存的手段…

【Godot4.3】胶囊形的偏移获取法

概述 之前用半圆弧拼接的方式求过胶囊形&#xff0c;在逐渐熟练使用Geometry2D的过程中&#xff0c;发现通过线段求端点是圆角类型的偏移多边形&#xff0c;获得的就是胶囊形。 所以我们有了第二种胶囊形求法。 测试代码 tool extends Node2D## 横向宽度 export var width:…

Java-数据结构-排序-(一) (。・ω・。)

文本目录&#xff1a; ❄️一、排序的概念及引用&#xff1a; ➷ 排序的概念&#xff1a; ➷ 常见的排序算法&#xff1a; ❄️二、插入排序的实现&#xff1a; ➷ 1、直接插入排序&#xff1a; ☞ 直接插入排序的基本思想&#xff1a; ☞ 直接插入排序的实现&#xff1a; ▶…