Qt开发 入门

1.Qt概述

什么是Qt

不论我们学习什么样的知识点首先第一步都需要搞明白它是什么,这样才能明确当前学习的方向是否正确,下面给大家介绍一下什么是Qt。

  • Qt是一个跨平台的C++应用程序开发框架

    • 具有短平快的优秀特质: 投资少、周期短、见效快、效益高
    • 几乎支持所有的平台, 可用于桌面程序开发以及嵌入式开发
    • 有属于自己的事件处理机制
    • 可以搞效率的开发基于窗口的应用程序。
  • Qt是标准C++的扩展, C++的语法在Qt中都是支持的

    • 良好封装机制使得Qt的模块化程度非常高,可重用性较好,可以快速上手。
    • Qt提供了一种称为 signals/slots 的安全类型来替代 callback(回调函数),这使得各个元件 之间的协同工作变得十分简单。

Qt的特点

知道了Qt是什么之后,给大家介绍一下Qt这个框架的一些优点,就是因为具有了这些优秀的特质才使得现在很多企业都首选Qt进行基于窗口的应用程序开发,并且近年来市场对Qt程序猿的需求也在不断攀升。

  • 广泛用于开发GUI程序,也可用于开发非GUI程序。

  • 有丰富的 API

    • Qt 包括多达250个以上的C++ 类
    • 可以处理正则表达式。
  • 支持 2D/3D 图形渲染,支持 OpenGL

  • Qt给程序猿提供了非常详细的官方文档

  • 支持XML,Json

  • 框架底层模块化, 使用者可以根据需求选择相应的模块来使用

  • 可以轻松跨平台

    • 和Java的跨平台方式不同
    • 在不同的平台使用的是相同的上层接口,但是在底层封装了不同平台对应的API。

Qt中的模块

Qt类库里大量的类根据功能分为各种模块,这些模块又分为以下几大类:

  • Qt 基本模块(Qt Essentials):提供了 Qt 在所有平台上的基本功能。

  • Qt 附加模块(Qt Add-Ons):实现一些特定功能的提供附加价值的模块。

  • 增值模块(Value-AddModules):单独发布的提供额外价值的模块或工具。

  • 技术预览模块(Technology Preview Modules):一些处于开发阶段,但是可以作为技术预览使用的模块。

  • Qt 工具(Qt Tools):帮助应用程序开发的一些工具。

在这里插入图片描述

2.第一个Qt项目

创建项目

创建基于窗口的Qt应用程序

在这里插入图片描述

在这里插入图片描述

指定项目的存储路径

在这里插入图片描述

  • 项目名称根据需求自己指定即可
  • 在指定项目的存储路径的时候, 路径中不能包含中文

指定默认的窗口类的名字以及窗口的类型

在这里插入图片描述

选择编译套件, 编译套件用于项目文件的编译, 如果安装了多个编译套件, 在这里选择其中一个就可以了。

在这里插入图片描述

选择版本控制工具, 比如: git, svn 等, 可以不指定。

在这里插入图片描述

项目文件

在创建的Qt项目中自动生成了一个后缀为 .pro 的项目文件,该文件中记录着项目的一些属性信息,具体信息如下:

# 在项目文件中, 注释需要使用 井号(#)
# 项目编译的时候需要加载哪些底层模块
QT       += core gui # 如果当前Qt版本大于4, 会添加一个额外的模块: widgets
# Qt 5中对gui模块进行了拆分, 将 widgets 独立出来了
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets# 使用c++11新特性
CONFIG += c++11	#如果在项目中调用了废弃的函数, 项目编译的时候会有警告的提示    
DEFINES += QT_DEPRECATED_WARNINGS# 项目中的源文件
SOURCES += \main.cpp \mainwindow.cpp# 项目中的头文件
HEADERS += \mainwindow.h# 项目中的窗口界面文件
FORMS += \mainwindow.ui

main.cpp

在这个源文件中有程序的入口函数main(),下面给大家介绍下这个文件中自动生成的几行代码:

#include "mainwindow.h"		// 生成的窗口类头文件
#include <QApplication>		// 应用程序类头文件int main(int argc, char *argv[])
{// 创建应用程序对象, 在一个Qt项目中实例对象有且仅有一个// 类的作用: 检测触发的事件, 进行事件循环并处理QApplication a(argc, argv);// 创建窗口类对象MainWindow w;// 显示窗口w.show();// 阻塞函数,应用程序对象开始事件循环, 保证应用程序不退出return a.exec();
}

mainwindow.ui

在Qt中每一个窗口都对应一个可编辑的可视化界面(*.ui), 这个界面对应的是一个xml格式的文件, 一般情况下不需要在xml格式下对这个文件进行编辑, 关于这个文件结构了解即可。

<!-- 双击这个文件看到的是一个窗口界面, 如果使用文本编辑器打开看到的是一个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="QMenuBar" name="menubar"/><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

mainwindow.h

这个文件是窗口界面对应的类的头文件。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>		// Qt标准窗口类头文件QT_BEGIN_NAMESPACE
// mainwindow.ui 文件中也有一个类叫 MainWindow, 将这个类放到命名空间 Ui 中
namespace Ui { class MainWindow; }	
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECT	// 这个宏是为了能够使用Qt中的信号槽机制public:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;		// 定义指针指向窗口的UI对象
};
#endif // MAINWINDOW_H

mainwindow.cpp

这个文件是窗口界面对应的类的源文件。

#include "mainwindow.h"
#include "ui_mainwindow.h"//构造函数
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)	// 基于mainwindow.ui创建一个实例对象
{// 将 mainwindow.ui的实例对象和当前类的对象进行关联// 这样同名的两个类对象就产生了关联, 合二为一了ui->setupUi(this);  
}//析构函数
MainWindow::~MainWindow()
{delete ui;
}

3.Qt中的窗口类

我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项, 分别为: QMainWindow、QDialog、QWidget如下图:
在这里插入图片描述

  • 常用的窗口类有3个

    • 在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的其中一个
  • QWidget

    • 所有窗口类的基类

    • Qt中的控件(按钮, 输入框, 单选框…)也属于窗口, 基类都是QWidget

    • 可以内嵌到其他窗口中: 没有边框

    • 可以不内嵌单独显示: 独立的窗口, 有边框

  • QDialog

    • 对话框类, 后边的章节会具体介绍这个窗口

    • 不能内嵌到其他窗口中

  • QMainWindow

    • 有工具栏, 状态栏, 菜单栏, 后边的章节会具体介绍这个窗口

    • 不能内嵌到其他窗口中

QWidget

新建一个Qt设计师界面类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

窗口的显示

  • 内嵌窗口

    • 依附于某一个大的窗口, 作为了大窗口的一部分
    • 大窗口就是这个内嵌窗口的父窗口
    • 父窗口显示的时候, 内嵌的窗口也就被显示出来了
  • 不内嵌窗口

    • 这类窗口有边框, 有标题栏

    • 需要调用函数才可以显示

编写mainwindows.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testwidget.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//一般在qt的构造函数中进行初始化操作//显示当前窗口的时候,显示另外一个窗口TestWidget//创建窗口对象,没有给W对象指定父对象TestWidget* w = new TestWidget;w->show();
}MainWindow::~MainWindow()
{delete ui;
}

在这里插入图片描述

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//一般在qt的构造函数中进行初始化操作//显示当前窗口的时候,显示另外一个窗口TestWidget
#if 0//创建窗口对象,没有给W对象指定父对象//要显示这个窗口必须要进行show()操作TestWidget* w = new TestWidget;w->show();
#else
#endif#if 1// 创建窗口对象,给W对象指定父对象// explicit TestWidget(QWidget *parent = nullptr);// 如果创建一个窗口对象的时候给其指定了父对象,这个窗口就不是一个独立窗口// 这样的话当前父窗口显示的时候,子窗口就一并被显示出来了// 这时候子窗口是没有边框的TestWidget* w = new TestWidget(this);
#else
#endif
}

在这里插入图片描述

QDialog

创建一个QDiglog界面类
在这里插入图片描述
非模态显示

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//一般在qt的构造函数中进行初始化操作//显示当前窗口的时候,显示另外一个窗口TestWidget
#if 1//创建窗口对象,没有给W对象指定父对象//要显示这个窗口必须要进行show()操作TestWidget* w = new TestWidget;w->show();
#else// 创建窗口对象,给W对象指定父对象// explicit TestWidget(QWidget *parent = nullptr);// 如果创建一个窗口对象的时候给其指定了父对象,这个窗口就不是一个独立窗口// 这样的话当前父窗口显示的时候,子窗口就一并被显示出来了// 这时候子窗口是没有边框的TestWidget* w = new TestWidget(this);
#endif//创建对话框窗口Dialog *dlg = new Dialog();//非模态dlg->show();
}

在这里插入图片描述
模态显示

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//一般在qt的构造函数中进行初始化操作//显示当前窗口的时候,显示另外一个窗口TestWidget
#if 1//创建窗口对象,没有给W对象指定父对象//要显示这个窗口必须要进行show()操作TestWidget* w = new TestWidget;w->show();
#else// 创建窗口对象,给W对象指定父对象// explicit TestWidget(QWidget *parent = nullptr);// 如果创建一个窗口对象的时候给其指定了父对象,这个窗口就不是一个独立窗口// 这样的话当前父窗口显示的时候,子窗口就一并被显示出来了// 这时候子窗口是没有边框的TestWidget* w = new TestWidget(this);
#endif#if 0//创建对话框窗口Dialog *dlg = new Dialog();//非模态dlg->show();
#else//创建对话框窗口Dialog *dlg = new Dialog();//模态,exec()//阻塞程序的执行dlg->exec();
#endif
}

在这里插入图片描述
运行后发现只能拖动Dialog的窗口,主窗口没有显示,因为Dialog被阻塞了,而主窗口需要在构造函数初始化结束才会显示。

4.坐标体系

在Qt关于窗口的显示是需要指定位置的,这个位置是通过坐标来确定的,所有坐标的选取又都是基于坐标原点来确定的,关于这些细节的确定,下面依次给大家进行讲解。

窗口的坐标原点

所有坐标的确定都需要先找到坐标原点, Qt的坐标原点在窗口的左上角

  • x轴向右递增
  • y轴向下递增
    在这里插入图片描述

窗口的相对坐标

在一个Qt窗口中一般都有很多子窗口内嵌到这个父窗口中,其中每个窗口都有自己的坐标原点,子窗口的位置也就是其使用的坐标点就是它的父窗口坐标体系中的坐标点。
在这里插入图片描述

  • 在Qt的某一个窗口中有可能有若干个控件, 这个控件都是嵌套的关系

    • A窗口包含B窗口, B窗口包含C窗口
  • 每个窗口都有坐标原点, 在左上角

    • 子窗口的位置是基于父窗口的坐标体系来确定的, 也就是说通过父窗口左上角的坐标点来确定自己的位置
  • Qt中窗口显示的时候使用的相对坐标, 相对于自己的父窗口

  • 将子窗口移动到父窗口的某个位置

示例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->move(10,10);// 创建一个按钮,让这个按钮作为当前创建的子控件QPushButton* btnA = new QPushButton(this);// 移动按钮的位置btnA->move(10,10);// 给按钮设置固定大小btnA->setFixedSize(200,200);// 创建第二个按钮,让这个按钮作为当前创建的子控件QPushButton* btnB = new QPushButton(btnA);// 移动按钮的位置btnB->move(10,10);// 给按钮设置固定大小btnB->setFixedSize(100,100);// 创建第二个按钮,让这个按钮作为当前创建的子控件QPushButton* btnC = new QPushButton(btnB);// 移动按钮的位置btnC->move(10,10);// 给按钮设置固定大小btnC->setFixedSize(50,50);
}

在这里插入图片描述

内存回收

在Qt中创建对象的时候会提供一个 Parent对象指针(可以查看类的构造函数),下面来解释这个parent到底是干什么的。

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

QWidget是能够在屏幕上显示的一切组件的父类。QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。

Qt 引入对象树的概念,在一定程度上解决了内存问题。

当一个QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。

任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的。

在这里插入图片描述
综上所述, 我们可以得到一个结论: Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收, 如果想要在Qt中实现内存的自动回收, 需要满足以下两个条件:

  • 创建的对象必须是QObject类的子类(间接子类也可以)
    • QObject类是没有父类的, Qt中有很大一部分类都是从这个类派生出去的
    • Qt中使用频率很高的窗口类和控件都是 QObject 的直接或间接的子类
  • 创建出的类对象, 必须要指定其父对象是谁, 一般情况下有两种操作方式:
// 方式1: 通过构造函数
// parent: 当前窗口的父对象, 找构造函数中的 parent 参数即可
QWidget::QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
QTimer::QTimer(QObject *parent = nullptr);// 方式2: 通过setParent()方法
// 假设这个控件没有在构造的时候指定符对象, 可以调用QWidget的api指定父窗口对象
void QWidget::setParent(QWidget *parent);
void QObject::setParent(QObject *parent);

测试

//SubWindows.cpp
#include "subwindows.h"
#include "ui_subwindows.h"
#include <QDebug>SubWindows::SubWindows(QWidget *parent) :QDialog(parent),ui(new Ui::SubWindows)
{ui->setupUi(this);
}SubWindows::~SubWindows()
{qDebug() << "我是SubWindows,我被析构了";delete ui;
}
//MainWindows.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "subwindows.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);SubWindows* sub = new SubWindows(this);sub->show();
}MainWindow::~MainWindow()
{delete ui;
}

在这里插入图片描述
关闭主窗口后,观察终端
在这里插入图片描述

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

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

相关文章

VM-Linux基础操作命令

目录 基础知识&#xff1a; Linux的组成 命令执行的本质&#xff1a; 通配符&#xff1a; 终端 1.命令提示符 1.2.命令格式 例一&#xff1a;查看内核 例二&#xff1a; 查看内核版本 例三&#xff1a;查看shell类型 例四&#xff1a;查看IP地址 2.cd命令 3.查看帮…

蓝牙核心规范(V5.4)12.3-深入详解之LE GATT安全级别特征

蓝牙篇之蓝牙核心规范&#xff08;V5.4&#xff09;深入详解汇总 1.知识回顾 蓝牙协议GATT&#xff08;Generic Attribute Profile&#xff09;是蓝牙设备间进行数据交换的标准协议之一。GATT是一种基于服务&#xff08;Service&#xff09;和特性&#xff08;Characteristic&…

摩尔纹是什么?如何消除摩尔纹?

相信很多小伙伴在渲染的时候会遇到各种各样的问题&#xff0c;比如摩尔纹&#xff0c;一张图片如果出现摩尔纹那基本就没法用了。那摩尔纹是什么呢&#xff1f;为什么会出现摩尔纹&#xff1f;又要如何消除摩尔纹呢&#xff1f;这篇文章我们就来探讨下。 一、摩尔纹是什么 官方…

记LGSVL Map Annotation(2)导入点云、以及地图

导入点云 内置的点云导入器工具提供了将最流行的点云文件格式&#xff08;PCD、PLY、LAS、LAZ&#xff09;转换为可用于仿真的数据所需的所有功能。 要访问点云导入器窗口&#xff0c;请在 Unity 编辑器中打开模拟器项目&#xff0c;然后导航到 Simulator/Import Point Cloud…

抓拍摄像机开关量控制4K高清手机远程看图建筑生长定时缩时相机

作为物联网数据采集解决方案专业提供商,数采物联网小编daq-iot 在这里做以下内容介绍,并诚挚的欢迎大家讨论和交流。 项目案例参考视频&#xff1a; https://www.bilibili.com/video/BV1Kp4y1T7wQ/?spm_id_from333.999.0.0 4K高清太阳能供电定时拍照相机&#xff0c;通过光…

c语言每日一练(15)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;上学期间将看学业情况更新。 五道选择题&#xff1a; 1、程序运行的结果…

【python绘图—colorbar操作学习】

文章目录 Colorbar的作用Colorbar的操作截取cmap拼接cmap双刻度列colorbar 引用 Colorbar的作用 Colorbar&#xff08;颜色条&#xff09;在绘图中的作用非常重要&#xff0c;它主要用于以下几个方面&#xff1a; 表示数据范围&#xff1a; Colorbar可以显示图中的颜色映射范围…

嵌入式Linux驱动开发(I2C专题)(五)

I2C系统驱动程序模型 参考资料&#xff1a; Linux内核文档: Documentation\i2c\instantiating-devices.rstDocumentation\i2c\writing-clients.rst Linux内核驱动程序示例: drivers/eeprom/at24.c 1. I2C驱动程序的层次 I2C Core就是I2C核心层&#xff0c;它的作用&#xf…

一同走进Linux的“基操”世界

一同走进Linux的“基操”世界 众所周知&#xff0c;Linux是一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发能力已经得到业界的认可&#xff0c;可以说&#xff0c;Linux现在就像是一个“当红明星”&#xff0c;其实力赢得了大多数人的赞同&#xff0c;流量…

C++红黑树

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了红黑树并且使用红黑树模拟实现set和map 文章目录 红黑…

嵌入式学习笔记(25)串口通信的基本原理

三根通信线&#xff1a;Tx Rx GND &#xff08;1&#xff09;任何通信都要有信息作为传输载体&#xff0c;或者有线的或则无线的。 &#xff08;2&#xff09;串口通信时有线通信&#xff0c;是通过串口线来通信的。 &#xff08;3&#xff09;串口通信最少需要2根&#xff…

基于人体呼出气体的电子鼻系统的设计与实现

基于人体呼出气体的电子鼻系统的设计与实现 摘要 电子鼻技术是通过模式识别技术对传感器采集的人体呼出气体进行分类训练的方法。本文研究实现的电子鼻系统包括下面几个部分:首先搭建以Arduino为控制核心的气路采集装置&#xff0c;包括MOS传感器和双阀储气袋构建的传感器阵列和…

在网站标题中使用可以让搜索引擎更容易(识别网站的主要内容)

随着互联网的飞速发展&#xff0c;越来越多的企业开始重视网站的优化。优化网站排名不仅可以增加曝光率和点击率&#xff0c;也可以提高品牌知名度和销售额。本文将从关键字优化方案入手&#xff0c;为大家详细介绍如何提升网站排名。 什么是关键字&#xff1f; 关键字是指用…

如何在Windows 10/11中重置网络,以及重置后的注意事项有哪些

本文介绍如何在Windows 10和Windows 11中重置网络设置。 如何重置Windows 10网络设置 在Windows10中使用网络重置实用程序相当简单。 一、进入“开始”菜单>“设置”,然后选择“网络和Internet”。 二、在左侧导航窗格中,选择“状态”以确保你正在查看网络状态窗口。然…

深入解析 Nginx 代理配置:从 server 块到上游服务器的全面指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

使用CFimagehost源码搭建免费的PHP图片托管私人图床,无需数据库支持

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

Kubernetes(K8S)集群部署

目录 一、创建3台虚拟机 二、为每台虚拟机安装Docker 三、安装kubelet 3.1 安装要求 3.2 为每台服务器完成前置设置 3.3 为每台服务器安装kubelet、kubeadm、kubectl 四、使用kubeadm引导集群 4.1 master服务器 4.2 node1、node2服务器 4.3 初始化主节点 4.4 work节…

学习视觉SLAM需要会些什么?

前言 SLAM是现阶段很多研究生的研究方向&#xff0c;我也是作为一个即将步入视觉SLAM的研究生&#xff0c;网上对于SLAM的介绍很多&#xff0c;但很少有人完整系统的告诉你学习视觉SLAM该有那些基础&#xff0c;那么此贴将告诉你学习SLAM你要有那些方面的基础。 文章目录 前言…

【AI】机器学习——线性模型(线性回归)

线性模型既能体现出重要的基本思想&#xff0c;又能构造出功能更加强大的非线性模型 参考&#xff1a;唐宇迪机器学习课程 文章目录 3.1 线性模型3.1.1 数据3.1.2 目标/应用 3.2 线性回归3.2.1 回归模型历史3.2.2 回归分析研究内容回归分析步骤 3.2.3 回归分析分类3.2.4 回归模…

Codeforces Round 895 (Div. 3) A ~ F

Dashboard - Codeforces Round 895 (Div. 3) - Codeforces A 问多少次能使a 和 b相等&#xff0c;就是abs(a - b) / 2除c向上取整&#xff0c;也就是abs(a - b)除2c向上取整。 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #de…