【Qt】环境安装与初识

目录

一、Qt背景介绍

二、搭建Qt开发环境

三、新建工程

四、Qt中的命名规范

五、Qt Creator中的快捷键

六、QWidget基础项目文件详解

6.1 .pro文件解析

6.2 widget.h文件解析

6.3 widget.cpp文件解析

6.4 widget.ui文件解析

6.5 main.cpp文件解析

七、对象树

八、窗口坐标系


一、Qt背景介绍

什么是Qt?

Qt是⼀个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展。Qt为开发者提供了一种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应用程序,同时也可以使用C++语言进行高级开发

图形用户界面:指采用图形方式显示的计算机操作用户界面,是计算机与其使用者之间的对话接口,是计算机系统的重要组成部分

Qt支持的平台

  • Windows ‒ XP、Vista、Win7、Win8、Win2008、Win10
  • Unix/X11 ‒ Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX、FreeBSD、BSD/OS、和其他很多X11平台
  • Macintosh ‒ Mac OS X
  • Embedded ‒ 有帧缓冲支持的嵌入式Linux平台,Windows CE
  • Android

Qt的版本

目前最新的版本是Qt6,但是相对来说Qt6和Qt5之间的核心功能区别不大,并且企业中也仍然有大量的项目在使用Qt5。因此后续文章上仍然使用Qt5版本来进行介绍

Qt在发布的时候还提供了两种许可证

  • 商业许可:开发者以商业目的使用Qt框架进行开发和发布软件的许可,开发者需要购买商业许可并按照相关规定使用Qt框架。商业许可提供了更多的功能和服务,适合于商业软件开发
  • 开源许可:开发者以非商业目的使用Qt框架进行开发和发布软件的许可,开发者可以免费使用Qt框架,但需要遵守开源许可协议的要求,如在软件中包含Qt许可协议的声明等

Qt的优点

  • 跨平台,几乎支持所有的平台
  • 接口简单,容易上手,学习Qt框架对学习其他框架有参考意义
  • 一定程度上简化了内存回收机制
  • 开发效率高,能够快速的构建应用程序
  • 有很好的社区氛围,市场份额在缓慢上升
  • 可以进行嵌入式开发

Qt的应用场景

  • 桌面应用程序

Qt能够创建各种类型的桌面应用程序,包括文件管理器、媒体播放器、绘图程序等。Qt应用程序支持多种操作系统,可以运行在Windows、Linux、macOS等桌面操作系统上

  • 移动应用程序

Qt支持Android和IOS移动操作系统,为应用程序提供了强大的跨平台能力。可以使用Qt构建各种
移动应用程序。如社交应用、游戏、娱乐等

  • 嵌入式系统

Qt在嵌入式领域应用非常广泛,可以构建面向各种设备的图形应用程序,在机顶盒、车载娱乐系统、安防监控设备等领域具有广泛的应用

二、搭建Qt开发环境

环境的下载与安装

先去官网下载Qt SDK:https://download.qt.io/archive/qt/

本文中下载的版本是5.14.2,可以自行选择

注意:

  • 在双击之前先断网,否则需要注册Qt账号登录后才能进入下一步安装
  • 安装路径时不能出现中文路径,否则即使安装上也无法使用

若电脑磁盘空间允许,建议全选以便后续使用;若空间不允许,请看下图自行选择

Qt环境变量配置

  • 找到Qt的安装路径,复制"bin"路径

  • 鼠标右键"此电脑",点击"属性",点击"高级系统设置",点击"环境变量"

  • "新建",填入"bin"路径,"确定"

环境变量是在操作系统中一个具有特定名字的对象,它包含了⼀个或者多个应用程序将要使用到的信息。如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还会到path中指定的路径中找。
在Windows上设置Qt的环境变量是为了能够在命令行或其他应用程序中直接访问Qt相关的命令和工具

三、新建工程

打开Qt Creator;在菜单栏中选中"文件";"新建文件或项目" 或者 使用快捷键Ctrl+n 或者 直接点击"new"

选择项目模板

新建项目对话框中有五类项目模板:

项目模板说明
ApplicationQt应用程序,包括普通窗体和QtQuick程序
Library可创建动态库、静态库、以及Qt Quick扩展插件、Qt Creator自身插件
其他项目可以创建单元测试项目,Qt4设计师自定义控件、子目录项目
Non-Qt-Project非Qt项目,可以创建纯C或纯C++项目
Import Project导入项目。从版本控制系统管理的软件项目中导入旧的项目

一般常用的是第一类Application,选择后,在右侧会看到Qt应用程序的多个子模板

子模板说明
Qt Widgets Application普通窗体模板,传统基于部件的窗体界面程序
Qt Console ApplicationQt控制台应用程序(使用较少)
Qt for python在Python下用LGPL的许可来开发闭源Qt软件
Qt Quick ApplicationQt提供的⼀种高级用户界面技术,使用它可以方便快速的为移动以及嵌入式设备开发流畅美观的用户界⾯。Qt Quick模块是开发QML应用的标准库,提供了使用QML创建用户界面所需的一切,包括可视化、交互、动画、模型、视图、粒子效果以及着色效果等

选择不同的项目模板,Qt Creator就会在后续项目创建好了之后生成不同的基础代码

选择构建系统

选择Qt项目的构建系统,使用默认的"qmake"即可

  • qmake:qmake是⼀个构建工具,用于自动生成makefile文件。qmake支持跨平台构建。qmake编辑的是⼀个后缀名为.pro的文件
  • CMake:CMake是⼀个跨平台的构建工具。CMake本身不是⼀个编译器,其实就是生成⼀个让编译器能读懂编译流程的文件工具。让CMake自动生成构建系统,如Makefile和Visual Studio项目文件。CMake是⼀个第三方工具,有自己的文档
  • Qbs:Qbs(Qt BuildSuite:Qt构建套件)同qmake、CMake一样都是构建工具。Qbs号称是新⼀代的构建⼯具,比qmake编译速度更快。Qbs没有绑定Qt版本,它从项目文件的高级项目描述中生成⼀个正确的依赖表。而传统的MakeFile生成工具如qmake和CMake,其在生成MakeFile文件后将实际的命令交给Make工具去执行

Qt官方声明,因市场原因,弃用Qbs。对于Qt用户来说,qmake是当前使用最广泛的构建工具,CMake其次

类信息设置界面

目前有三种基类可供选择:

基类说明
QWidget最简单、最基本的窗体程序,里面可以放置多个控件实现程序功能
QMainWindow主窗口类,一般用于较为复杂的应用程序,除了中央客户区界面,还包括菜单栏、工具栏、状态栏以及多个可停靠的工具对话框
QDialog基于对话框的程序,对话框一般用户弹窗,也可以用于主界面显示。对话框是从QWidget继承而来的,并丰富了一些功能,如模态显示和返回值等

三个类之间的关系如下图:

选择Qt套件

默认只有第⼀个"Desktop Qt 5.14.2 MinGW 64-bit",若安装配置了多个Qt套件,就可以都选上。Qt套件是指Qt程序从编译链接到运行环境的全部工具和Qt类库的集合,对于MinGW版本Qt程序生成和调试,至少需要MinGW中的编译器g++(自动调用链接器)、g++配套的基础库、调器gdb还
有使用MinGW环境编译而成的Qt类库自身。默认情况下,在上面Kit Selection里选中全部套件

选择版本控制系统

在项目管理界面可以设置作为子项目,以及加入版本控制系统管理。这两个功能暂时用不到,都用默认的<None>,然后点击"完成"

若想把代码提交到码云或者github,可以在此处选择git作为版本控制系统

四、Qt中的命名规范

驼峰命名法: 

  • 类名:首字母大写,单词和单词之间首字母大写
  • 函数名及变量名:首字母小写,单词和单词之间首字母大写

Qt偏好驼峰命名法,这一点不像之前学习的STL偏好蛇形命名,如unordered_map等

五、Qt Creator中的快捷键

  • 注释:ctrl + /
  • 运行:ctrl + R
  • 编译:ctrl + B
  • 字体缩放:ctrl + 鼠标滑轮
  • 查找:ctrl + F
  • 整行移动:ctrl + shift + ⬆/⬇
  • 帮助文档:鼠标定位+F1
  • 自动对齐:ctrl + i
  • 同名的 .h 和 .cpp 的切换:F4
  • 生成函数声明的对应定义: alt + enter
  • ctrl +鼠标左键 跳转定义 ,Alt+键盘方向左键 跳转回来

六、QWidget基础项目文件详解

6.1 .pro文件解析

工程新建好之后,在工程目录列表中有一个后缀为".pro"的文件,即工程文件,是qmake自动生成的用于生成makefile的配置文件

双击进入该文件,该文件的核心内容如下: 

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
TARGET = QtTest
TEMPLATE = appSOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui
  • 注释:从"#"开始,直到该行结束
  • QT += core gui:Qt包含的模块

  • greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

这条语句的含义是,若QT_MAJOR_VERSION大于4,即当前使用的Qt5及更高版本,需要增加widgets模块。若项目仅需支持Qt5,也可以直接添加"QT += widgets"⼀句。不过为了保持代码兼容,最好还是按照Qt Creator生成的语句编写

  • CONFIG += c++11

CONFIG用来告诉qmake关于应用程序的配置信息,上述语句说明使用c++11的特性

  • DEFINES += QT_DEPRECATED_WARNINGS

定义编译选项。QT_DEPRECATED_WARNINGS表示当Qt的某些功能被标记为过时的,那么编译器会发出警告

  • TARGET = QtTest:指定生成的应用程序名
  • TEMPLATE = app:告诉qmake为这个应用程序生成哪种makefile
app建立一个应用程序的makefile,默认值,若模板没有被指定,这个将会被使用
lib建立一个库的makefile
vcapp建立一个应用程序的VisualStudio项目文件
vclib建立一个库的VisualStudio项目文件
subdirs这是一个特殊的模板。它可以创建一个能够进入特定目录的makefile并且为它调用make的makefile
  • 工程中包含的源文件:SOURCES += main.cpp/widget.cpp
  • 工程中包含的头文件:HEADERS += widget.h
  • 工程中包含的资源文件:RESOURCES += painter.qrc
  • 工程中包含的"ui"设计文件:FORMS += widget.ui

6.2 widget.h文件解析

说明: 

  • 在Qt中,若要使用信号与槽(signal和slot)的机制就必须加入Q_OBJECT宏
  • Ui::Widget *ui;这个指针是用前面声明的namespace Ui中的Widget类定义的(不是同一个Widget),所以指针ui指向可视化设计的界面,后面要访问界面上的组件,都需要通过这个指针ui去访问
  • Ui:Widget继承自Ui_Widget类,Ui_Widget类位于ui_widget.h文件中,ui_widget.h文件是对widget.ui文件编译后自动生成的

6.3 widget.cpp文件解析

widget.cpp文件是类Widget的实现代码,所有在窗体上要实现的功能添加在此文件中

6.4 widget.ui文件解析

widget.ui是窗体界面定义文件,是一个XML文件,定义了窗口上的所有组件的属性设置、布局,及其信号与槽函数的关联等。用UI设计器可视化设计的界面都由Qt自动解析,并以XML文件的形式保存下来。在设计界面时,只需在UI设计器里进行可视化设计即可,而不用管widget.ui文件是怎么生成的

6.5 main.cpp文件解析

#include "widget.h"#include <QApplication> // Qt系统提供的标准类名声明头⽂件,没有.h后缀int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;                   //实例化窗⼝对象w.show();                   //调⽤show函数显⽰窗⼝return a.exec();
}
  • QApplication为应用程序类,QApplication a为应用程序对象,有且仅有⼀个
  • QApplication管理图形用户界面应用程序的控制流和主要设置。QApplication是Qt的整个后台管理的命脉。它包含主事件循环,在其中来自窗口系统和其它资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。对于任何一个使用Qt的图形用户界面应用程序,都正好存在⼀个QApplication对象,而不论这个应用程序在同⼀时间内是不是有0、1、2或更多个窗口
  • a.exec():程序进入消息循环,等待对用户输入进行响应。这里main()把控制权转交给Qt,Qt完成事件处理工作,当应用程序退出的时候exec()的值就会返回。在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件

七、对象树

在Qt中创建很多对象的时候会提供一个parent对象指针,这个parent到底是干什么的呢?

QObject是以对象树的形式组织起来的

  • 当创建一个QObject对象时,会看到QObject的构造函数接收⼀个QObject指针作为参数,这个参数就是parent,即父对象指针
  • 在创建QObject对象时,可以提供⼀个其父对象,创建的这个QObject对象会自动添加到其父对象的children()列表
  • 当父对象析构的时候,这个列表中的所有对象也会被析构。注意:这里的父对象并不是继承意义上的父类!)

这种机制在GUI程序设计中相当有用。如,一个按钮有一个QShortcut(快捷键)对象作为其子对象。当删除按钮的时候,这个快捷键理应被删除。这是合理的

QWidget是能够在屏幕上显示的一切组件的父类

  • QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的⼀个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。如:当用户关闭⼀个对话框的时候,应用程序将其删除,我们希望属于这个对话框的按钮、图标等应该⼀起被删除。因为这些都是对话框的子组件
  • 我们也可以自己删除子对象,它们会自动从其父对象列表中删除。如:当删除了一个工具栏时,其所在的主窗口会自动将该工具栏从其子对象列表中删除,并且自动调整屏幕显示

对象树机制一定程度上解决了内存问题

  • 当一个QObject对象在堆上创建的时候,Qt会同时为其创建一个对象树。不过对象树中对象的顺序是没有定义的,即销毁这些对象的顺序也是未定义的
  • 任何对象树中的QObject对象delete时,若这个对象有parent,则自动将其从parent的children()列表中删除;若有孩子,则自动delete每一个孩子。Qt保证没有QObject会被delete两次,这是由析构顺序决定的

若QObject在栈上创建,Qt保持同样的行为。正常情况下也不会发生什么问题

作为父组件的window和作为子组件的quit都是QObject的子类。这段代码是正确的,quit的析构函数不会被调用两次,因为标准C++要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作用域时,会先调用quit的析构函数,将其从父对象window的子对象列表中删除,然后才会再调用window的析构函数

上述代码的析构顺序就有了问题。在上面的代码中,作为父对象的window会先被析构,因为它是最后一个创建的对象。在析构过程中,它会调用子对象列表中每一个对象的析构函数,即quit此时就被析构了。然后代码继续执行,在window析构之后,quit也会被析构,因为quit也是⼀个局部变量,在超出作用域的时候当然也需要析构。但是,这时候已经是第⼆次调用quit的析构函数了,C++不允许调用两次析构函数,因此,程序崩溃了

自定义MyPushButton类观察释放过程

 mypushbutton.h:

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H#include <QPushButton>
#include <QDebug>class MyPushButton : public QPushButton
{Q_OBJECT
public:explicit MyPushButton(QWidget *parent = nullptr);~MyPushButton();//添加MyPushButton类的析构函数signals:};#endif // MYPUSHBUTTON_H

 mypushbutton.cpp:

#include "mypushbutton.h"MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{qDebug() << "我的按钮的构造函数被调用";
}MyPushButton::~MyPushButton()
{qDebug() << "我的按钮的析构函数被调用";
}

widget.h:

#include "widget.h"
#include "ui_widget.h"
#include "mypushbutton.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);MyPushButton* button = new MyPushButton(this);//传入this,将其设置到对象树中,当窗口关闭时就会自动调用其析构函数button->setText("我的按钮");
}Widget::~Widget()
{qDebug() << "Widget的析构函数被调用";delete ui;
}

对象树确保的是先释放子节点的内存,后释放父节点的内存。而析构函数的调用顺序则不⼀定遵守上述要求,因此看到子节点的析构执行顺序反而在父节点析构顺序之后

注意:调用析构函数和释放内存并非是同一件事情

总结

Qt的对象树机制虽然在⼀定程度上解决了内存问题,但是也引入了⼀些值得注意的事情。这些细节在今后的开发过程中很可能时不时跳出来烦扰一下,所以最好从开始就养成良好习惯

注意:在Qt中,尽量在构造的时候就指定parent对象,并且大胆在堆上创建

八、窗口坐标系

坐标体系:以左上角度为原点(0,0),X向右增加,Y向下增加

对于嵌套窗口,其坐标是相对于父窗口而言的

可以使用代码设置控件在坐标系中的位置

#include "widget.h"
#include "ui_widget.h"
#include "mypushbutton.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* btn1 = new QPushButton("按钮1", this);btn1->move(200, 300);QPushButton* btn2 = new QPushButton("按钮2", this);qDebug() << "按钮1的坐标为:[" << btn1->x() << "," << btn1->y() << "]";qDebug() << "按钮2的坐标为:[" << btn2->x() << "," << btn2->y() << "]";
}Widget::~Widget()
{delete ui;
}

200与300都代表着像素点 

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

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

相关文章

垃圾分类|城市垃圾分类管理系统|基于Springboot的城市垃圾分类管理系统设计与实现(源码+数据库+文档)

城市垃圾分类管理系统目录 目录 基于Springboot的城市垃圾分类管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、垃圾列表 2、公告信息管理 3、公告类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …

【王道数据结构】【chapter5树与二叉树】【P159t15】

设计一个算法将二叉树的叶结点从左到右的顺序连成一个单链表&#xff0c;表头指针为head。二叉树按二叉链表方式存储&#xff0c;链接时用叶结点的右指针来存放单链表指针。 #include <iostream> #include <stack> #include <queue> typedef struct treenode…

【AIGC】Stable Diffusion 的提示词入门

一、正向提示词和反向提示词 Stable Diffusion 中的提示词通常用于指导用户对生成的图像进行控制。这些提示词可以分为正向提示词&#xff08;Positive Prompts&#xff09;和反向提示词&#xff08;Negative Prompts&#xff09;两类&#xff0c;它们分别影响图像生成过程中的…

《春山》中的贝叶斯统计——白敬亭衣服合理概率及决策比重。

目录 1. 全身黑衣服合理概率2. 真的是导演组允许&#xff1f;3. 粉丝的证据是否站得住&#xff1f;4.总结 感谢up主链接: 【理工春山学】只谈事实 从统计角度深度剖析春山学&#xff0c;她使用贝叶斯统计合理分析了在舞台中白敬亭、双魏、导演组出错的概率。接下来我采用一个新…

吐血整理!操作系统【处理机调度】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 1 基本概念1.1 总览1.2 什么是调度1.2.1 调度1.2.2 处理机调度 1.3 调度的三个层次1.3.1 高级调度1.3.2 中级调度&#xff08;内存调度&#xff09;1.3.3 低级调度&#xf…

【leetcode994】腐烂的橘子(BFS)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 首先将所有烂橘子入队&#xff0c;然后常规BFS遍历&#xff0c;注意while的截止条件除了队列为空&#xff0c;新鲜橘子数量大于0&#xff08;没新鲜橘子也没必要继续遍历&#xff0c;保证时间计算的正确性&#xff09;&a…

哈希切分

目录 一 二 三 2.单个子文件太大怎么办&#xff1f;&#xff08;分两种情况讨论&#xff09; 一 这样的题目典型就是KV模型的问题&#xff0c;即通过key IP找对应的value 出现次数&#xff0c;对于KV模型的问题首先想到的就是用map来统计次数&#xff0c;但是100G大小的文件…

Docker 第十四章 : Docker 三剑客之 Machine

第十四章 : Docker 三剑客之 Machine 本章知识点: Docker Machine 是 Docker 三剑客之一,它是一个工具,允许用户在本地或远程机器上创建 Docker 主机。它简化了 Docker 环境的设置,特别是在不同的操作系统和云平台上。通过 Docker Machine,用户可以轻松地在虚拟机或物理…

基于四叉树的图像分割算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................................................... Imgs(dx 1 : dx R1, dy 1 …

Spring中的事务实现、失效场景即AOP的相关概念理解

spring实现事务&#xff08;声明式事务&#xff09;的本质就是aop完成的,它会对方法的前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或回滚事务。aop就是面向切面编程&#xff0c;在spring中将那些与业务无关&#xff0c;但却对多个对象产生影响的…

【硬核】javascript轻松实现自动化批量取消某音用户关注功能

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

高程 | 继承与派生(c++)

文章目录 &#x1f4da;继承的概念和语法&#x1f4da;派生类生成过程&#x1f4da;继承权限和继承方式&#x1f407;公有继承&#x1f407;私有继承&#x1f407;保护继承 &#x1f4da;类型转换规则&#x1f4da;派生类构造函数和析构函数&#x1f4da;继承中的静态成员特性&…

Linux rp_filter、arp_filter、arp_ignore、arp_announce参数说明

Linux rp_filter、arp_filter、arp_ignore、arp_announce参数说明。我查看了参考资料&#xff0c;又去查阅了官方文档&#xff0c;凭着我的理解整理了以下文档。各位大神的文档写的很好&#xff0c;但都不喜欢断句啊&#xff0c;读的我这叫一个累。 参考 1.网络编程之网络丢包…

IDEA工程与模块管理

一、IDEA项目结构 层级关系&#xff1a; project(工程) - module(模块) - package(包) - class(类)具体的&#xff1a; 一个project中可以创建多个module一个module中可以创建多个package一个package中可以创建多个class二、Project和Module的概念 在 IntelliJ IDEA 中&…

机器学习——聚类问题

&#x1f4d5;参考&#xff1a;西瓜书ysu老师课件博客&#xff08;3&#xff09;聚类算法之DBSCAN算法 - 知乎 (zhihu.com) 目录 1.聚类任务 2.聚类算法的实现 2.1 划分式聚类方法 2.1.1 k均值算法 k均值算法基本原理&#xff1a; k均值算法算法流程&#xff1a; 2.2 基于…

GD32F303VET6裸板调试遇到问题

1、开始串口中断的时候会死机&#xff1a;nvic_irq_enable(USART0_IRQn, 3, 0); 解决&#xff1a;要设置中断优先级分组: nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0); 2、初始化的时候多几次使用 printf 会HardFault_Handler&#xff1a; 解决&#xff1a;因为RTOS中…

《剑指offer》

本专题是分享剑指offer的一些题目&#xff0c;开始刷题计划。 二维数组的中的查找【https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId13&tqId11154&ru/exam/oj】 描述 在一个二维数组array中&#xff08;每个一维数组的长度相同&#xff0…

大端和小端传输字节完整版

大端和小端传输字节序 大端和小端一、最高有效位、最低有效位1.MSB(Most significant Bit)最高有效位2.LSB(Least Significant Bit)最低有效位 二、内存地址三、大端和小端四、网络字节序和主机字节序五、C#位操作符六、C#中关于大端和小端的转换七、关于负数八、关于汉字编码以…

论文阅读 - Non-Local Spatial Propagation Network for Depth Completion

文章目录 1 概述2 模型说明2.1 局部SPN2.2 非局部SPN2.3 结合置信度的亲和力学习2.3.1 传统正则化2.3.2 置信度引导的affinity正则化 3 效果3.1 NYU Depth V23.2 KITTI Depth Completion 参考资料 1 概述 本文提出了一种非局部的空间传播网络用于深度图补全&#xff0c;简称为…

边缘计算:重塑数字世界的未来

引言 随着物联网&#xff08;IoT&#xff09;设备的激增和5G网络的普及&#xff0c;我们正站在一个计算模式的新纪元门槛上——边缘计算。这一技术范式将数据处理和分析推向网络的边缘&#xff0c;即设备或终端&#xff0c;为实时性要求较高的应用提供了前所未有的可能性。 目…