当前位置: 首页 > news >正文

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多了四个控件,这些控件都是组成窗口的重要部分,而且在实际运用中,窗口界面才是被运用的最多的,所以理解这四个控件尤为重要。

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

相关文章:

Qt_窗口界面QMainWindow的介绍

目录 1、菜单栏QMenuBar 1.1 使用QMainWindow的准备工作 1.2 在ui文件中设计窗口 1.3 在代码中设计窗口 1.4 实现点击菜单项的反馈 1.5 菜单中设置快捷键 1.6 菜单中添加子菜单 1.7 菜单项中添加分割线和图标 1.8 关于菜单栏创建方式的讨论 2、工具栏QToolBar …...

华为云centos7.9按装ambari 2.7.5 hostname 踩坑记录

华为云centos7.9按装ambari 2.7.5踩坑记录 前言升华总结 前言 一般都是废话&#xff0c;本人专业写bug业余运维。起初找了三台不废弃的台式机&#xff0c;开始重装centos系统&#xff0c;开始了HDP3.1.5Ambari2.7.5安装。 推荐一波好文&#xff0c;一路长绿。跑了一段时间没啥…...

重生之我们在ES顶端相遇第15 章 - ES 的心脏-倒排索引

文章目录 前言为什么叫倒排索引数据结构如何生成如何查询TF、IDF参考文档 前言 上一章&#xff0c;简单介绍了 ES 的节点类型。 本章&#xff0c;我们要介绍 ES 中非常重要的一个概念&#xff1a;倒排索引。 ES 的全文索引就是基于倒排索引实现的。 本章内容建议重点学习&…...

金刚石切削工具学习笔记分享

CVD钻石-合成单晶钻石之一 金刚石具有极高的硬度和耐磨性、较低的摩擦系数、较高的弹性模量、较高的热导率、较低的热膨胀系数、与有色金属的亲和力较小等优点&#xff0c;是目前最硬的工具材料&#xff0c;主要分为单晶金刚石和聚晶金刚石两大类。单晶金刚石又分为天然单晶金…...

【文献阅读】基于原型的自适应方法增强未见到的构音障碍者的语音识别

基于原型的自适应方法增强未见到的构音障碍者的语音识别 文献原文链接 https://www.isca-archive.org/interspeech_2024/wang24x_interspeech.pdf 引言 构音障碍是一种由神经系统疾病或肌肉异常引起的言语障碍,影响了个体清晰发音的能力。这种情况常伴随脑瘫、帕金森病和头部…...

Kafka-Go学习

文章目录 1. **安装 kafka-go**2. **基本概念**3. **kafka-go 基本用法**3.1 创建 Producer&#xff08;生产者&#xff09;3.2 创建 Consumer&#xff08;消费者&#xff09;3.3 生产者和消费者配置详解生产者配置 (kafka.WriterConfig)消费者配置 (kafka.ReaderConfig) 4. **…...

Nginx反向代理出现502 Bad Gateway问题的解决方案

&#x1f389; 前言 前一阵子写了一篇“关于解决调用百度翻译API问题”的博客&#xff0c;近日在调用其他API时又遇到一些棘手的问题&#xff0c;于是写下这篇博客作为记录。 &#x1f389; 问题描述 在代理的遇到过很多错误码&#xff0c;其中出现频率最高的就是502&#x…...

通信工程学习:什么是VLAN虚拟局域网

VLAN&#xff1a;虚拟局域网 VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种将物理局域网在逻辑上划分成多个广播域的通信技术。以下是关于VLAN的详细解释&#xff1a; 一、VLAN虚拟局域网的定义与概述 VLAN通过逻辑方式将网络中的设备…...

python qt5 常用

QT5中如何设置让窗口根据屏幕比例显示设置&#xff1f; desktop QDesktopWidget().screenGeometry() self.resize(int(desktop.width() * 0.3), int(desktop.height()*0.5)) QT5中关于背景穿透问题的处理方式&#xff1f; 场景如下&#xff1a;我们在开发的时候&#xff0c…...

漏洞复现_永恒之蓝

1.概述 永恒之蓝&#xff08;EternalBlue&#xff09;是一个影响Windows操作系统的远程代码执行漏洞&#xff0c;编号为CVE-2017-0144&#xff0c;最初由美国国家安全局&#xff08;NSA&#xff09;开发并利用&#xff0c;后来被黑客组织Shadow Brokers泄露。该漏洞存在于SMBv…...

PyCharm的使用

PyCharm的入门使用教程 下载和安装PyCharm&#xff1a; 首先&#xff0c;访问JetBrains官方网站&#xff08;https://www.jetbrains.com/pycharm/&#xff09;下载PyCharm的最新版本。根据您的操作系统选择合适的版本进行下载。 安装完成后&#xff0c;打开PyCharm。 创建新…...

浅谈C#之AutoResetEvent和ManualResetEvent

一、基本介绍 AutoResetEvent和ManualResetEvent都是同步原语&#xff0c;它们用于线程之间的协调和通信。它们都是从EventWaitHandle类派生的&#xff0c;但它们在重置事件状态的行为上有所不同。 二、简单示例 AutoResetEvent AutoResetEvent是一个自动重置的事件。当一个线…...

【网络安全 | 靶机搭建】修改镜像源、更新软件源、安装git、更改python版本等

文章目录 0x00、必要准备0x01、修改镜像源0x02、更新软件源并清除缓存0x03、安装git0x04、更改默认Python版本为python30x05、安装增强功能0x06、vmware虚拟机导出iso0x00、必要准备 安装虚拟机时必须保存用户名、密码,用于后续操作,可以截图保存: 以下内容按个人需要进行配…...

VuePress搭建文档网站/个人博客(详细配置)主题配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

Go语言笔记

目录 一、变量声明 二、流程控制 if&#xff08;条件判断&#xff09; for&#xff08;循环结构&#xff09; Switch&#xff08;简化if&#xff09; goto&#xff08;跳出循环&#xff09; 三、运算符 1、算数运算符 2、关系运算符 3、逻辑运算符 4、位运算符 5、…...

java缓存介绍

在Java编程中&#xff0c;缓存技术是一种非常有效的优化手段&#xff0c;用于减少数据访问的延迟和提高应用性能。缓存技术通过存储数据的副本在内存中&#xff0c;使得后续对相同数据的请求能够直接从内存中快速获取&#xff0c;而不需要再次进行耗时的磁盘访问或网络请求。 缓…...

react中diff的选择性子树渲染

在React中&#xff0c;组件的渲染是高效的&#xff0c;这得益于React的虚拟DOM&#xff08;Virtual DOM&#xff09;和diff算法。React的diff算法主要用于比较旧虚拟DOM树和新虚拟DOM树之间的差异&#xff0c;并仅更新实际DOM中需要变化的部分&#xff0c;从而提高性能。 关于…...

Git clone远程仓库没有其他分支的问题

在使用Git克隆&#xff08;Git clone&#xff09;时&#xff0c;可能遇到分支不全的问题。有以下几种可能的原因和解决方法&#xff1a; 未将所有分支克隆下来&#xff1a;默认情况下&#xff0c;Git只会克隆远程仓库的主分支。如果您想要克隆其他分支&#xff0c;可以使用以下…...

山东潍坊戴尔存储服务器维修 md3800f raid恢复

山东戴尔存储故障维修 存储型号&#xff1a;DELL PowerVault md3800f 故障问题&#xff1a;存储除尘后通电开机&#xff0c;发现有物理硬盘没有插到位&#xff0c;用户带电拔插了多块物理盘&#xff0c;导致关连的磁盘阵列掉线&#xff0c;卷失败&#xff1b; 处理方式&#xf…...

Hive企业级调优[6]——HQL语法优化之任务并行度

目录 HQL语法优化之任务并行度 优化说明 Map端并行度 Reduce端并行度 优化案例 HQL语法优化之任务并行度 优化说明 对于分布式计算任务来说&#xff0c;设置一个合理的并行度至关重要。Hive的计算任务依赖于MapReduce框架来完成&#xff0c;因此并行度的调整需要从Map端和…...

别再硬啃理论了!用STM32F407+OpenMV做个会‘看’会‘动’的小车,代码全开源

从零打造会“思考”的智能小车&#xff1a;STM32F407OpenMV实战指南 当你第一次看到这个小车精准识别路标并自主避障时&#xff0c;那种成就感会瞬间点燃你对嵌入式开发的热情。这不是又一套枯燥的理论教程&#xff0c;而是一个真实可用的智能小车项目——它能用摄像头“看”世…...

终极魔兽争霸III优化工具:WarcraftHelper完整配置指南

终极魔兽争霸III优化工具&#xff1a;WarcraftHelper完整配置指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸III作为经典即时战略游戏&a…...

别再手动配环境了!用Docker Compose一键部署GeoServer,5分钟搞定TIF影像发布

5分钟极速部署GeoServer&#xff1a;Docker Compose全自动化实战指南 每次新项目启动都要重复配置GeoServer&#xff1f;还在为环境变量和端口冲突头疼&#xff1f;GIS开发中最耗时的从来不是业务逻辑&#xff0c;而是这些本该自动化的基础设施搭建。今天我们就用Docker Compo…...

FPGA实战:用Verilog手搓8点FFT核心(附完整代码与仿真对比)

FPGA实战&#xff1a;从零构建8点FFT核心的完整指南 在数字信号处理领域&#xff0c;快速傅里叶变换&#xff08;FFT&#xff09;算法是当之无愧的"瑞士军刀"。作为一名FPGA工程师&#xff0c;我曾在多个项目中需要将FFT算法部署到硬件平台&#xff0c;期间积累了不少…...

如何高效完成SVN到Git的无缝迁移:svn2git终极实战指南

如何高效完成SVN到Git的无缝迁移&#xff1a;svn2git终极实战指南 【免费下载链接】svn2git 项目地址: https://gitcode.com/gh_mirrors/sv/svn2git 如果你正在考虑将版本控制系统从SVN迁移到Git&#xff0c;那么svn2git工具将是你的最佳选择。这款专业的Ruby工具能够智…...

新手零失败指南:基于快马平台生成win10安装openclaw的交互式学习应用

最近在Windows 10上折腾OpenClaw的安装&#xff0c;作为新手真的踩了不少坑。环境配置报错、依赖冲突、权限问题...每次遇到错误都要花大量时间搜索解决方案。后来发现用InsCode(快马)平台可以快速生成带交互指导的安装程序&#xff0c;终于找到了适合新手的打开方式。这里把完…...

别再乱装JDK了!Win11下用Eclipse Temurin OpenJDK 17的正确姿势(附路径避坑指南)

Win11开发者必看&#xff1a;Eclipse Temurin OpenJDK 17终极配置指南 刚接触Java开发的工程师小张最近遇到件怪事——明明按照教程安装了JDK&#xff0c;运行项目时却总是报错"找不到主类"。折腾两天后才发现&#xff0c;问题出在安装路径里的一个中文字符。这种看…...

华硕笔记本终极性能调校指南:GHelper开源控制工具完全解析

华硕笔记本终极性能调校指南&#xff1a;GHelper开源控制工具完全解析 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目…...

OpenClaw插件系统:让AI能力无限扩展

前言 前面入我们已经掌握了OpenClaw的基本用法&#xff1a;安装部署、飞书接入、人设配置、Skill扩展。 但如果你想让OpenClaw接入更多平台、集成更多能力怎么办&#xff1f; 答案是&#xff1a;插件系统。 插件是OpenClaw的核心扩展机制。通过插件&#xff0c;你可以&…...

常见开源软件协议介绍

在当今数字化时代&#xff0c;开源软件如同一股洪流&#xff0c;席卷了整个技术领域。从我们日常使用的操作系统&#xff0c;到复杂的大数据处理框架&#xff0c;开源软件无处不在。然而&#xff0c;在这繁荣的开源生态背后&#xff0c;有一群默默守护规则的 “卫士”&#xff…...