第一个Qt开发实例(一个Push Button按钮和两个Label)【包括如何在QtCreator中创建新工程、代码详解、编译、环境变量配置、测试程序运行等】

目录

  • Qt开发环境QtCreator的安装、配置
  • 在QtCreator中创建新工程
  • 在`Forms→mainwindow.ui`中拖曳出我们要的图形按钮
  • 查看拖曳出按钮后的代码
  • 为`pushButton`这个图形添加回调函数
  • 编译工程
  • 关闭开发板上QT的GUI(选做)
  • 禁止LCD黑屏(选做)
  • 设置Qt运行的环境变量
  • 运行Qt程序
  • 如何让程序在系统启动时运行
  • 附完整源代码
    • mainwindow.ui 中的代码
    • mainwindow.h 中的代码
    • mainwindow.cpp 中的代码
    • main.cpp 中的代码
  • 附编译完成后完整的工程目录

Qt开发环境QtCreator的安装、配置

详情见 https://blog.csdn.net/wenhao_ir/article/details/145367198

在QtCreator中创建新工程

在这里插入图片描述
在这里插入图片描述
然后设置工程的名字和位置:
在这里插入图片描述
上图中点击Next…
我们这里使用qmake进行构建,所以选择qmake:
在这里插入图片描述
上图中继续点击Next…
在这里插入图片描述
这里是设置Qt的C++代码中类的名字和相关文件的名字,这些使用默认的就可以了。

上图中继续点击Next…
在这里插入图片描述
上图是设置语言的转换,不是编译语言的转换哈,就是英语、汉语、法语的那种语言,我们不需要作这个操作,所以继续Next。
在这里插入图片描述
在这里插入图片描述
这里选择在博文 https://blog.csdn.net/wenhao_ir/article/details/145367198 中配置的kit,即 qt_klt_swh_01:
在这里插入图片描述
继续Next…
在这里插入图片描述
然后Finish…
在这里插入图片描述
上面的警告:

Warning: The code model could not parse an included file, which might lead to incorrect code completion and highlighting, for example.

不用管,这个警告是由于下面这句代码出现的:

#include <QApplication>

由于目录:

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/c++

不存在,而导致的。

但我们这里不用管,因为我们后面的代码不会使用头文件#include <QApplication>

Forms→mainwindow.ui中拖曳出我们要的图形按钮

双击文件mainwindow.ui
在这里插入图片描述
在这里插入图片描述
Buttons里拖曳出一个Push Button【按住下图中的Push Button不放往中间拖】
在这里插入图片描述
按住下图中的Push Button不放往中间拖:
在这里插入图片描述
不妨重命名为LED
在这里插入图片描述
左侧图形分类栏往下拉,找到Display Widgets,然后拖曳出两个Label
在这里插入图片描述
在这里插入图片描述

查看拖曳出按钮后的代码

点击下图中的Edit
在这里插入图片描述
然后就可以看到刚才拖曳出的三个图形对应的源文件(xml语法写成):
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QPushButton" name="pushButton"><property name="geometry"><rect><x>90</x><y>130</y><width>89</width><height>25</height></rect></property><property name="text"><string>LED</string></property></widget><widget class="QLabel" name="label"><property name="geometry"><rect><x>260</x><y>80</y><width>71</width><height>41</height></rect></property><property name="text"><string>TextLabel</string></property></widget><widget class="QLabel" name="label_2"><property name="geometry"><rect><x>260</x><y>160</y><width>71</width><height>31</height></rect></property><property name="text"><string>TextLabel</string></property></widget></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>22</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

从这个xml文件中,我们可以看到有三个图形,名字分别为:pushButton、label、label_2。

这里不妨先把文件mainwindow.ui保存一下,快捷键CTRL+S。

然后我们要给pushButton这个图形添加回调函数。

pushButton这个图形添加回调函数

打开 Headers→mainwindow.h
在这里插入图片描述
把下面的代码:

private slots:void on_pushButton_clicked();

复制到下面的位置:
在这里插入图片描述
作用是对函数on_pushButton_clicked进行声明,当然是在类MainWindow中进行声明。
其中的关键词slots的作用见我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/145421581

上面代码中的Q_OBJECT的解释如下:
Q_OBJECT 是 Qt 中的一个宏,通常出现在声明继承自 QObject 的类中(如 QMainWindow)。它是 Qt 的元对象系统的一部分,用来启用类的信号和槽机制、事件处理等功能。

然后去文件mainwindow.cpp中去实现函数on_pushButton_clicked
在这里插入图片描述
我们在类的外部去定义它,代码如下:

void MainWindow::on_pushButton_clicked()
{qDebug()<<"LED clicked";
}

上面的函数 qDebug()需要引入头文件#include <QDebug>,写完后,文件mainwindow.cpp中的完整代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{qDebug()<<"LED clicked";
}

这段代码就是开头几句不太好理解,那个其实是类的构造函数的初始化列表,详情见 https://blog.csdn.net/wenhao_ir/article/details/145422254
看完上面这篇博文后就可以分析下面的代码了:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}

首先要知道这个类的原型其实是定义在Headers→mainwindow.h中的,其完整定义如下:

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;
};

上面代码中的Q_OBJECT的解释如下:
Q_OBJECT 是 Qt 中的一个宏,通常出现在声明继承自 QObject 的类中(如 QMainWindow)。它是 Qt 的元对象系统的一部分,用来启用类的信号和槽机制、事件处理等功能。

Ui是一个命名空间,这个在以前使用OpenCV时已经比较熟悉了。

回到对下面代码的分析:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}

这是在类MainWindow的声明外定义类MainWindow的构造函数,它的作用是初始化 MainWindow 界面。我们来详细解析其中的语法和逻辑:

这段代码是 MainWindow 类的 构造函数,它的作用是初始化 MainWindow 界面。我们来详细解析其中的语法和逻辑:


1. MainWindow::MainWindow(QWidget *parent)

  • MainWindow 是类的构造函数,MainWindow(QWidget *parent) 表示它可以接收一个 QWidget *parent 指针,默认情况下,这个 parent 可能为空(即 nullptr)。
  • parent 参数用于 Qt 的 父子对象机制,确保在销毁 parent 时,其子对象(即 MainWindow 的实例)也会被自动销毁,避免内存泄漏。

2. QMainWindow(parent)

  • 这个是 初始化列表中的一项内容,关于初始化列表的详细介绍见博文 https://blog.csdn.net/wenhao_ir/article/details/145422254
  • :QMainWindow(parent) 调用了 QMainWindow 的构造函数,并将 parent 传递给它。
  • QMainWindowMainWindow 的基类,这样可以正确初始化 QMainWindow 的内部成员,使 MainWindow 继承窗口管理的功能。

3. ui(new Ui::MainWindow)

  • 这个也是 初始化列表中的一项内容,关于初始化列表的详细介绍见博文 https://blog.csdn.net/wenhao_ir/article/details/145422254
  • ui 是一个指向 Ui::MainWindow 的指针【Ui:是一个命名空间】,通过 new Ui::MainWindow 在堆上创建 UI 界面对象(ui 由 Qt Designer 生成)。
  • 这里 Ui::MainWindow 负责界面元素的管理,比如按钮、标签、文本框等。

4. ui->setupUi(this);

  • setupUi(this) 这个函数由 Qt Designer 生成,它的作用是:
    • ui 设计的界面组件添加到 MainWindow 界面上
    • 自动连接 Qt Designer 里设定的信号和槽(如果使用了 Qt 的自动连接机制)。
    • 初始化 UI 控件,比如设置按钮的名称、默认状态等。

小结
该构造函数的作用是:

  1. 调用基类 QMainWindow 的构造函数,确保 MainWindow 作为窗口正确初始化。
  2. 创建 Ui::MainWindow 实例,用于管理 UI 界面。
  3. 调用 setupUi(this);,设置 UI 界面元素,使其在 MainWindow 窗口上可见。

你可以理解成:

  • QMainWindow(parent) 负责窗口管理;
  • ui(new Ui::MainWindow) 负责界面管理;
  • ui->setupUi(this) 负责把界面元素加载到 MainWindow 中。

这样 MainWindow 才能正确显示界面,并响应用户操作。

编译工程

在这里插入图片描述
编译的时候右下角会提示编译进度。
在这里插入图片描述

有两个警告不用管(因为不是语法上的错,只是配置上的一点瑕疵):
在这里插入图片描述
编译出的结果在工程目录中,具体如下:
在这里插入图片描述
在这里插入图片描述
上图中的test_01就是生成的可执行程序。
我们可以按照博文 https://blog.csdn.net/wenhao_ir/article/details/144651612 的方法查看下它是不是运行于ARM架构上的可执行文件,这样可以检查我们的gcc编译器是否配置正确。

file /home/book/Qt_project/Q001_test_01/build-test_01-qt_kit_swh_01-Debug/test_01

运行结果如下:

/test_01: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 4.9.0, not stripped

从中可以看出,它是ARM架构的,并且需要动态链接库的支持,所以需要检查开发板上有没有配置Qt运行环境,我在博文 https://blog.csdn.net/wenhao_ir/article/details/145367198 【搜索“那么如何判断开发板上有没有配置Qt运行环境呢”】中已经检查过了。

test_01放到NFS文件系统的目录中:
在这里插入图片描述

关闭开发板上QT的GUI(选做)

注意:后来我发现其实这一步并不需要。没有这一步测试程序同样能正常运行并且显示出测试程序绘制GUI界面
注意:后来我发现其实这一步并不需要。没有这一步测试程序同样能正常运行并且显示出测试程序绘制GUI界面
注意:后来我发现其实这一步并不需要。没有这一步测试程序同样能正常运行并且显示出测试程序绘制GUI界面
打开串口终端→打开开发板

参考博文 https://blog.csdn.net/wenhao_ir/article/details/144591685 用一次性有效的方法(即不是永久有效的方法)关掉自带的QT的GUI界面。

这里用一次性的方法,即不是永久有效的方法:
执行下面这条命令:

/etc/init.d/S99myirhmi2 stop

执行完成后再用手去操作屏幕上的UI界面,UI界面就没有任何反应了,说明QT的GUI界面被关掉了。

禁止LCD黑屏(选做)

注意:后来我发现其实这一步并不一定需要,因为很多时候我们的测试时间都是比较短的。
注意:后来我发现其实这一步并不一定需要,因为很多时候我们的测试时间都是比较短的。
注意:后来我发现其实这一步并不一定需要,因为很多时候我们的测试时间都是比较短的。
关闭开发析上QT的GUI后,还需要禁止LCD黑屏,否则过一会儿LCD会黑屏,用下面的命令实现:

echo -e "\033[9;0]" > /dev/tty0

这条命令的详细解释见 https://blog.csdn.net/wenhao_ir/article/details/145431203

设置Qt运行的环境变量

export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
export QT_QPA_FONTDIR=/usr/lib/fonts/

上面三条命令的详细解释见 https://blog.csdn.net/wenhao_ir/article/details/145433648 【这篇博文中包含第1条命令生效的必要条件,还包括如果让三条命令一直有效的方法,可以看一下。】

运行Qt程序

挂载网络文件系统

mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

然后运行我们编译出的Qt测试程序:

注意:运行前请确保Qt运行的环境变量设置好了。
注意:运行前请确保Qt运行的环境变量设置好了。

/mnt/qt_test01/test_01

运行结果如下:
在这里插入图片描述
提示先不用管,这是正常的,教程视频中也有这样的提示。

同时,屏幕上也出现了我们用Qt绘制的界面:
在这里插入图片描述
然后用手点击LED按钮…
在这里插入图片描述
发现每点击一次就打印出一次字符串“LED clicked”,这样测试就成功了。

如何让程序在系统启动时运行

参考:博文 https://blog.csdn.net/wenhao_ir/article/details/144591685 【查看“永久有效的关掉QT的GUI界面最简单的方法”】 和 视频 https://www.bilibili.com/video/BV1HT421k7GW/?spm_id_from=333.1391.0.0&p=7&vd_source=8fb767d1739ea6b35c7177ba909eed36【10分15秒开始看,并且要看把视频看完了再开始做,因为视频中第1次的方法是有问题的。】

附完整源代码

mainwindow.ui 中的代码

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QPushButton" name="pushButton"><property name="geometry"><rect><x>90</x><y>130</y><width>89</width><height>25</height></rect></property><property name="text"><string>LED</string></property></widget><widget class="QLabel" name="label"><property name="geometry"><rect><x>260</x><y>80</y><width>71</width><height>41</height></rect></property><property name="text"><string>TextLabel</string></property></widget><widget class="QLabel" name="label_2"><property name="geometry"><rect><x>260</x><y>160</y><width>71</width><height>31</height></rect></property><property name="text"><string>TextLabel</string></property></widget></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>22</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

mainwindow.h 中的代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp 中的代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{qDebug()<<"LED clicked";
}

main.cpp 中的代码

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

附编译完成后完整的工程目录

https://pan.baidu.com/s/1yhnmQGpnYl2I-urBsQt5Ew?pwd=88iw
注意:QtCreator的工程换位置后一定要更换一下Build directory的位置,因为在QtCreator中Build directory是一个绝对路径,详情见 https://blog.csdn.net/wenhao_ir/article/details/145458743

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

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

相关文章

Spring Security(maven项目) 3.0.3.0版本

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

携程Java开发面试题及参考答案 (200道-上)

说说四层模型、七层模型。 七层模型(OSI 参考模型) 七层模型,即 OSI(Open System Interconnection)参考模型,是一种概念模型,用于描述网络通信的架构。它将计算机网络从下到上分为七层,各层的功能和作用如下: 物理层:物理层是计算机网络的最底层,主要负责传输比特流…

【Rust自学】16.4. 通过Send和Sync trait来扩展并发

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 16.4.1. Send和Sync trait Rust语言本身的并发特性较少&#xff0c;目前所提及的并发特性都来自于标准库&#xff0c;而不是语言本身。其…

MYSQL面试题总结(题目来源JavaGuide)

MYSQL基础架构 问题1&#xff1a;一条 SQL语句在MySQL中的执行过程 1. 解析阶段 (Parsing) 查询分析&#xff1a;当用户提交一个 SQL 语句时&#xff0c;MySQL 首先会对语句进行解析。这个过程会检查语法是否正确&#xff0c;确保 SQL 语句符合 MySQL 的语法规则。如果发现…

传输层协议——TCP协议

文章目录 &#x1f34d;TCP协议谈谈可靠性TCP协议格式序号与确认序号窗口大小六个标志位 确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP的应用层协…

pycharm(2)

conda 我下载安装conda的时候产生了各种问题&#xff0c;最终我发现&#xff0c;打开杀毒软件会有阻碍 cuda的版本问题很大&#xff0c;我尝试多个版本之后&#xff0c;发现anaconda3-2024.06.1-windows-x86_64安装了之后不会报错&#xff0c;另外pycharm的版本也一直有问题&a…

python算法和数据结构刷题[3]:哈希表、滑动窗口、双指针、回溯算法、贪心算法

回溯算法 「所有可能的结果」&#xff0c;而不是「结果的个数」&#xff0c;一般情况下&#xff0c;我们就知道需要暴力搜索所有的可行解了&#xff0c;可以用「回溯法」。 回溯算法关键在于:不合适就退回上一步。在回溯算法中&#xff0c;递归用于深入到所有可能的分支&…

【PyQt】pyqt小案例实现简易文本编辑器

pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器&#xff0c;使用PyQt5框架构建。以下是代码的主要功能和特点&#xff1a; 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…

鼠标拖尾特效

文章目录 鼠标拖尾特效一、引言二、实现原理1、监听鼠标移动事件2、生成拖尾元素3、控制元素生命周期 三、代码实现四、使用示例五、总结 鼠标拖尾特效 一、引言 鼠标拖尾特效是一种非常酷炫的前端交互效果&#xff0c;能够为网页增添独特的视觉体验。它通常通过JavaScript和C…

Node.js与嵌入式开发:打破界限的创新结合

文章目录 一、Node.js的本质与核心优势1.1 什么是Node.js&#xff1f;1.2 嵌入式开发的范式转变 二、Node.js与嵌入式结合的四大技术路径2.1 硬件交互层2.2 物联网协议栈2.3 边缘计算架构2.4 轻量化运行时方案 三、实战案例&#xff1a;智能农业监测系统3.1 硬件配置3.2 软件架…

利用Vue和javascript分别编写一个“Hello World”的定时更新

目录 一、利用Vue编写一个“Hello World”的定时更新&#xff08;1&#xff09;vue编码在Html文件中&#xff08;2&#xff09;vue编码在js文件中 二、利用javascript编写一个“Hello World”的定时更新 一、利用Vue编写一个“Hello World”的定时更新 &#xff08;1&#xff…

排序算法--插入排序

插入排序是一种简单且稳定的排序算法&#xff0c;适合小规模数据或部分有序数据。 // 插入排序函数 void insertionSort(int arr[], int n) {for (int i 1; i < n; i) { // 从第二个元素开始int key arr[i]; // 当前需要插入的元素int j i - 1;// 将比 key 大的元素向后移…

跟李沐学AI:视频生成类论文精读(Movie Gen、HunyuanVideo)

Movie Gen&#xff1a;A Cast of Media Foundation Models 简介 Movie Gen是Meta公司提出的一系列内容生成模型&#xff0c;包含了 3.2.1 预训练数据 Movie Gen采用大约 100M 的视频-文本对和 1B 的图片-文本对进行预训练。 图片-文本对的预训练流程与Meta提出的 Emu: Enh…

CH340G上传程序到ESP8266-01(S)模块

文章目录 概要ESP8266模块外形尺寸模块原理图模块引脚功能 CH340G模块外形及其引脚模块引脚功能USB TO TTL引脚 程序上传接线Arduino IDE 安装ESP8266开发板Arduino IDE 开发板上传失败上传成功 正常工作 概要 使用USB TO TTL&#xff08;CH340G&#xff09;将Arduino将程序上传…

游戏引擎 Unity - Unity 下载与安装

Unity Unity 首次发布于 2005 年&#xff0c;属于 Unity Technologies Unity 使用的开发技术有&#xff1a;C# Unity 的适用平台&#xff1a;PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域&#xff1a;开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…

AIGC(生成式AI)试用 20 -- deepseek 初识

>> 基本概念 Ollama -- 运行大模型&#xff0c;管理运行AI大模型的工具&#xff0c;用来安装布置DeepSeek https://ollama.com/ , Get up and running with large language models. AnythingLLM -- 大模型增强应用&#xff0c;GUI大模型交互程序 Download AnythingLLM …

STM32 DMA+AD多通道

接线图 代码配置 ADC单次扫描DMA单次转运模式 uint16_t AD_Value[4]; //DMAAD多通道 void DMA_Config(void) {//定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量 ADC_InitTypeDef ADC_InitStructure; //定义ADC结构体变量 DMA_InitTypeDef DMA_In…

【Java】位图 布隆过滤器

位图 初识位图 位图, 实际上就是将二进制位作为哈希表的一个个哈希桶的数据结构, 由于二进制位只能表示 0 和 1, 因此通常用于表示数据是否存在. 如下图所示, 这个位图就用于标识 0 ~ 14 中有什么数字存在 可以看到, 我们这里相当于是把下标作为了 key-value 的一员. 但是这…

【工欲善其事】利用 DeepSeek 实现复杂 Git 操作:从原项目剥离出子版本树并同步到新的代码库中

文章目录 利用 DeepSeek 实现复杂 Git 操作1 背景介绍2 需求描述3 思路分析4 实现过程4.1 第一次需求确认4.2 第二次需求确认4.3 第三次需求确认4.4 V3 模型&#xff1a;中间结果的处理4.5 方案验证&#xff0c;首战告捷 5 总结复盘 利用 DeepSeek 实现复杂 Git 操作 1 背景介绍…

BGP路径属性

公认必遵循 BGP必须都能识别&#xff0c;且必须发送报文必须包含 Origin&#xff1a;起源属性&#xff0c;I,E,&#xff1f;三种&#xff0c;I是BGP通过IGP协议学到的路由&#xff08;比如ospf&#xff0c;isis&#xff0c;rip&#xff09;&#xff0c;E是从EGP协议学到的&am…