Qt中QSplitter使QWidget改变屏占比

news2024/12/24 9:25:55

Qt系列文章目录

文章目录

  • Qt系列文章目录
  • 前言
  • 一、QSplitter是什么?
  • 二、具体代码
    • 1.头文件
    • 2.实现文件
  • 总结

前言

在Qt中把QWidget窗体三等分,我想实现QWidget中的三等分窗口能够像QDockWidget类一样用鼠标拖动这三等分窗体边缘使屏占比改变。一般我们会直接使用QDockWidget,但是我们这里只想鼠标拖拽,不需要窗体停靠的功能。
QDockWidget类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。QDockWidget可以移动、悬浮,在许多工程软件中,都是使用dock布局窗口,用户可以自由组合窗口界面。
我们可以使用QSplitter控件,布局器中控件大小是根据窗口大小自动调整,用户能拉伸窗口但是不能直接拉伸界面内部的某个控件
先看一下效果
在这里插入图片描述

一、QSplitter是什么?

一个QSplitter是一个可以包含其他控件的控件,这些控件被一个分隔条隔开,托拽这个分隔条,可以改变splitter的子控件的大小。

QSplitter控件经常做为布局管理器使用,给用户提供更多的界面控制。
默认情况下,QSplitter动态调整子节点的大小,也即是鼠标按下拖动的时候,控件大小也随着变,如果希望QSplitter只在调整大小操作结束时调整子节点的大小,也即是鼠标按下拖动的时候不调整大小,释放鼠标之后,也即是调整结束后才调整大小,用setOpaqueResize(false) 来设置。

控件之间的初始大小分布由初始大小与拉伸因子相乘确定。还可以使用 setSizes() 来设置所有 控件的大小。函数 sizes() 返回用户设置的大小。或者,我们以分别使用 saveState() 和restoreState() 从QByteArray保存和恢复 之前控件的大小状态,等下一次启动的时候把这个状态再恢复就好啦。

当我们 hide() 一个子节点控件时,它的空间将被分配给其他的子节点。当我们 show() 它时,它将被恢复。
1.QSplitter的构造方法:

QSplitter *splitterMain=new QSplitter(Qt::Horizontal,0);

第一个参数通过Qt::Horizontal 和 Qt::Vertical来设定为水平分割或垂直分割。第二个设定0代表是主窗口,无父窗口。

不过子splitter设置的

new QSplitter(Qt::Vertical,splitterMain);

代表主窗口是splitterMain。则子splitter就被添加到splitterMain中。

添加时为从左至右(或从上至下)添加;

二、具体代码

1.头文件

#ifndef PROJECTWIN_H
#define PROJECTWIN_H

#include <QWidget>
#include <QStandardPaths>
#include <QDir>
#include <QDebug>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QSplitter>
#include <QTextEdit>
#include <QVector>
#include <QFile>
#include <QTextStream>
#include <QSplitter>
#include "FileMonitorMgr.h"

namespace Ui {
class ProjectWin;
}


const QString styles = "QTreeView\
{\
        background-color: #5B677A;\
        font-size:17px;\
        color: white;\
}\
    QTreeView::item:hover\
{\
        background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1);\
        border: 1px solid #bfcde4;\
}\
    QTreeView::item:hover\
{\
        background: rgb(69, 187, 217);\
}\
    QTreeView::item:selected:active\
{\
        background: rgb(255, 62, 150);\
}\
    QTreeView::item:selected:!active\
{\
        background: rgb(63, 147, 168);\
}\
    QTreeView::branch\
{\
        background:#5B677A;\
}\
    QTreeView::branch:has-children:!has-siblings:closed,QTreeView::branch:closed:has-children:has-siblings\
{\
        border-image: none;\
        background:#5B677A;\
        image: url(image/Folder-1.png);\
}\
    QTreeView::branch:open:has-children:!has-siblings,QTreeView::branch:open:has-children:has-siblings\
{\
        border-image: none;\
        background:#5B677A;\
        image: url(image/Open-Folder.png);\
}";


class ProjectWin : public QWidget
{
    Q_OBJECT
public:
    static ProjectWin* getInstance();
    ~ProjectWin();

    FileMonitorMgr *m_fileMgr;
    QString m_paraFolder;
private:
    QTreeWidget* m_picTree;
//    QTreeWidget* m_paraTree;
    QWidget* m_naviWgt;

private:
    void initWidget();
    void initPicTree();
    void readParaFile(QString filePath);
private:
    Ui::ProjectWin *ui;
    QGridLayout* m_grid;
    QWidget* m_centralWidget;
    QTabWidget* m_tabWidget;
    QTabWidget* m_tabWidgetPara;
    QTabWidget* m_tabWidgetNavi;
    QTextEdit*  m_paraText;
    QVBoxLayout* m_mainLayout;

    static ProjectWin* m_pInstance;
private:
    explicit ProjectWin(QWidget *parent = nullptr);
    static void destroyInstance();
public:
Q_SIGNALS:
    void sigShowImageBorder(const QString &imageName);
//    void appendText(const QString &text);
public Q_SLOTS:
    void slotPicTree(QVector<QString> lst, QString path);
    void slotNavi(const QString& file);
    void onItemClicked(QTreeWidgetItem *item, int column);
    void slotParaInfo(QString imageName);
    void slotImageSelectNode(QString imageName);
    void slotUpdatePicTree(const QStringList& fileList);
};

#endif // PROJECTWIN_H

2.实现文件

#include "ProjectWin.h"
#include "ui_ProjectWin.h"

#pragma execution_character_set("utf-8")


ProjectWin* ProjectWin::m_pInstance = nullptr;

ProjectWin* ProjectWin::getInstance()
{
    if(!m_pInstance)
    {
        m_pInstance = new ProjectWin();
        atexit(destroyInstance);
    }
    return m_pInstance;
}

void ProjectWin::destroyInstance()
{
    if(m_pInstance)
    {
        delete m_pInstance;
        m_pInstance = nullptr;
    }
}

ProjectWin::~ProjectWin()
{
    delete ui;
}

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

    //图像列表
    m_tabWidget = new QTabWidget();
//    m_tabWidget->setStyleSheet("border: 0; background: transparent");
//    m_tabWidget->setStyleSheet("border: 0");
    m_picTree = new QTreeWidget();
//    m_picTree->setStyleSheet("border: 0; background: transparent");
    m_picTree->hide();
    m_picTree->setStyleSheet("border: 1");
    m_picTree->setContextMenuPolicy(Qt::CustomContextMenu);
    m_picTree->setColumnCount(1);
    m_picTree->setHeaderHidden(true);
    connect(m_picTree, &QTreeWidget::itemClicked, this, &ProjectWin::onItemClicked);

    //图像参数
    m_tabWidgetPara = new QTabWidget();
    m_paraText = new QTextEdit();
    m_tabWidgetPara->addTab(m_paraText, u8"分裂器中间的窗体"/*u8"图像参数数据"*/);
    m_tabWidgetPara->setStyleSheet("border: 1");
    m_paraText->setStyleSheet("border: 1");

//    m_tabWidgetPara->setTabText(0, u8"图像参数数据");

    //导航
    m_tabWidgetNavi = new QTabWidget();
    m_naviWgt = new QWidget();
    m_tabWidgetNavi->addTab(m_naviWgt, u8"分裂器最下面的窗体"/*u8"导航"*/);

    //创建三个部件组
    QWidget* picGroup = new QWidget();
    QWidget* paraGroup = new QWidget();
    QWidget* naviGroup = new QWidget();

    // 只设置QWidget的边框为0,不影响子元素
    picGroup->setStyleSheet("QWidget { border: 0px }");
    paraGroup->setStyleSheet("QWidget { border: 0px }");
    naviGroup->setStyleSheet("QWidget { border: 0px }");

    QSplitter* splitter= new QSplitter(Qt::Vertical, this);
    splitter->addWidget(picGroup);
    splitter->addWidget(paraGroup);
    splitter->addWidget(naviGroup);

    QList<int> sizes;
    sizes << this->height() / 3 << this->height() / 3 << this->height() / 3;
    splitter->setSizes(sizes);

    // 设置拉伸比例,其中1、1、1表示三个窗口的初始尺寸比例都是1,即相等
    splitter->setStretchFactor(0, 1);
    splitter->setStretchFactor(1, 1);
    splitter->setStretchFactor(2, 1);

    QVBoxLayout* picLayout = new QVBoxLayout();
    picLayout->setMargin(0);
    picLayout->setSpacing(0);
    picLayout->addWidget(m_tabWidget);
    picLayout->addWidget(m_picTree);
    picGroup->setLayout(picLayout);

    QVBoxLayout* paraLayout = new QVBoxLayout();
    paraLayout->setMargin(0);
    paraLayout->setSpacing(0);
    paraLayout->addWidget(m_tabWidgetPara);
//    paraLayout->addWidget(m_paraText);
    paraGroup->setLayout(paraLayout);

    QVBoxLayout* naviLayout = new QVBoxLayout();
    naviLayout->setMargin(0);
    naviLayout->setSpacing(0);
    naviLayout->addWidget(m_tabWidgetNavi);
    naviGroup->setLayout(naviLayout);

    // 设置窗口的主布局
    QVBoxLayout* mainLayout = new QVBoxLayout();
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
//    mainLayout->addWidget(picGroup);
//    mainLayout->addWidget(paraGroup);
//    mainLayout->addWidget(naviGroup);
    mainLayout->addWidget(splitter);
    this->setLayout(mainLayout);

//    connect(this, &ProjectWin::appendText, m_paraText, &QTextEdit::append);
}

void ProjectWin::onItemClicked(QTreeWidgetItem *item, int column)
{
    QString imageName = item->text(0);
    emit sigShowImageBorder(imageName);
}

void ProjectWin::initWidget()
{

    //    m_picTree->header()->hide();//设置隐藏头
}

void ProjectWin::initPicTree()
{

}

void ProjectWin::readParaFile(QString filePath)
{
    if (!m_paraText) {
        qDebug() << "m_paraText is null!";
        return;
    }

    m_paraText->clear();

    QString txtFile = filePath.left(filePath.size() -3);
    txtFile += "txt";
    QFile file(txtFile);
    if(!file.open(QIODevice::ReadOnly)) {
        qDebug() << file.errorString();
        return;
    }

    QTextStream in(&file);
    in.setCodec("UTF-8");  // 设置编码为UTF-8

    while(!in.atEnd()) {
        QString line = in.readLine();
//        emit appendText(line);  // 使用信号来添加文本
        m_paraText->append(line);
        // 这里处理每一行
        qDebug() << line;
    }

    file.close();
}

void ProjectWin::slotPicTree(QVector<QString> lst, QString path)
{
    m_paraFolder = path;
    m_picTree->show();
    QTreeWidgetItem* topItem = new QTreeWidgetItem(m_picTree);
    topItem->setText(0, path);
    topItem->setCheckState(0, Qt::Checked);
    m_picTree->addTopLevelItem(topItem);
    int count = lst.size();
    //添加顶层节点
    if (lst.size() > 0)
    {
        for (int i = 0; i < lst.size(); i++)
        {
            //int size = lst.at(i).size();
            //int pos = lst.at(i).lastIndexOf("/");
            //QString temp = lst.at(i).right(size - pos - 1);
            QTreeWidgetItem* item = new QTreeWidgetItem(topItem);
            item->setText(0, lst.at(i));
            item->setCheckState(0, Qt::Checked);
        }
    }

    m_picTree->expandAll();
    //    m_grid = new QGridLayout(this);
    //    m_grid->addWidget(m_picTree);
    m_picTree->setStyleSheet(styles);

    //    this->setLayout(m_grid);

    m_tabWidget->addTab(m_picTree, u8"彩C");
}

void ProjectWin::slotParaInfo(QString imageName)
{
    QString fullPath = m_paraFolder + "/" + imageName;
    readParaFile(fullPath);
}

void ProjectWin::slotImageSelectNode(QString imageName)
{
    QList<QTreeWidgetItem *> items = m_picTree->findItems(imageName, Qt::MatchExactly | Qt::MatchRecursive);

    if(!items.empty()){
        m_picTree->setCurrentItem(items.at(0));
    }
}

void ProjectWin::slotUpdatePicTree(const QStringList &fileList)
{
    for(const QString& str : fileList)
    {
        QTreeWidgetItem* item = new QTreeWidgetItem(m_picTree);
        item->setText(0, str);
        item->setCheckState(0, Qt::Checked);
    }

}

void ProjectWin::slotNavi(const QString& file)
{
    m_tabWidgetNavi->addTab(m_naviWgt, u8"导航");
}

总结

主要是看ProjectWin的构造函数

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

    //图像列表
    m_tabWidget = new QTabWidget();
//    m_tabWidget->setStyleSheet("border: 0; background: transparent");
//    m_tabWidget->setStyleSheet("border: 0");
    m_picTree = new QTreeWidget();
//    m_picTree->setStyleSheet("border: 0; background: transparent");
    m_picTree->hide();
    m_picTree->setStyleSheet("border: 1");
    m_picTree->setContextMenuPolicy(Qt::CustomContextMenu);
    m_picTree->setColumnCount(1);
    m_picTree->setHeaderHidden(true);
    connect(m_picTree, &QTreeWidget::itemClicked, this, &ProjectWin::onItemClicked);

    //图像参数
    m_tabWidgetPara = new QTabWidget();
    m_paraText = new QTextEdit();
    m_tabWidgetPara->addTab(m_paraText, u8"分裂器中间的窗体"/*u8"图像参数数据"*/);
    m_tabWidgetPara->setStyleSheet("border: 1");
    m_paraText->setStyleSheet("border: 1");

//    m_tabWidgetPara->setTabText(0, u8"图像参数数据");

    //导航
    m_tabWidgetNavi = new QTabWidget();
    m_naviWgt = new QWidget();
    m_tabWidgetNavi->addTab(m_naviWgt, u8"分裂器最下面的窗体"/*u8"导航"*/);

    //创建三个部件组
    QWidget* picGroup = new QWidget();
    QWidget* paraGroup = new QWidget();
    QWidget* naviGroup = new QWidget();

    // 只设置QWidget的边框为0,不影响子元素
    picGroup->setStyleSheet("QWidget { border: 0px }");
    paraGroup->setStyleSheet("QWidget { border: 0px }");
    naviGroup->setStyleSheet("QWidget { border: 0px }");

    QSplitter* splitter= new QSplitter(Qt::Vertical, this);
    splitter->addWidget(picGroup);
    splitter->addWidget(paraGroup);
    splitter->addWidget(naviGroup);

    QList<int> sizes;
    sizes << this->height() / 3 << this->height() / 3 << this->height() / 3;
    splitter->setSizes(sizes);

    // 设置拉伸比例,其中1、1、1表示三个窗口的初始尺寸比例都是1,即相等
    splitter->setStretchFactor(0, 1);
    splitter->setStretchFactor(1, 1);
    splitter->setStretchFactor(2, 1);

    QVBoxLayout* picLayout = new QVBoxLayout();
    picLayout->setMargin(0);
    picLayout->setSpacing(0);
    picLayout->addWidget(m_tabWidget);
    picLayout->addWidget(m_picTree);
    picGroup->setLayout(picLayout);

    QVBoxLayout* paraLayout = new QVBoxLayout();
    paraLayout->setMargin(0);
    paraLayout->setSpacing(0);
    paraLayout->addWidget(m_tabWidgetPara);
//    paraLayout->addWidget(m_paraText);
    paraGroup->setLayout(paraLayout);

    QVBoxLayout* naviLayout = new QVBoxLayout();
    naviLayout->setMargin(0);
    naviLayout->setSpacing(0);
    naviLayout->addWidget(m_tabWidgetNavi);
    naviGroup->setLayout(naviLayout);

    // 设置窗口的主布局
    QVBoxLayout* mainLayout = new QVBoxLayout();
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
//    mainLayout->addWidget(picGroup);
//    mainLayout->addWidget(paraGroup);
//    mainLayout->addWidget(naviGroup);
    mainLayout->addWidget(splitter);
    this->setLayout(mainLayout);

//    connect(this, &ProjectWin::appendText, m_paraText, &QTextEdit::append);
}

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

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

相关文章

微服务保护之初识Sentinel、流量控制、隔离和降级、授权规则、规则持久化

微服务保护 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff…

redis高级篇(1)----redis的持久化

分布式缓存 单节点redis的问题: 1)数据丢失的问题&#xff0c;redis是基于内存来进行存储的&#xff0c;当服务器重启的时候可能会丢失数据 2)无法满足高并发场景 3)如果redis宕机&#xff0c;那么这个服务不可用&#xff0c;所以就需要有一种自动的故障恢复手段&#xff0c;必…

Python模糊控制

Python模糊控制 概念和术语 模糊逻辑&#xff08;Fuzzy Logic&#xff09;是一种方法论&#xff0c;其基础是可以在连续统一体上表达某物的“真实性”。这就是说某事不是真或假&#xff0c;而是部分正确或部分错误。 模糊变量&#xff08;fuzzy variable&#xff09;具有明确…

联想笔记本电脑可以开机但是无法进入到桌面怎么办?

联想笔记本电脑可以开机但是无法进入到桌面怎么办&#xff1f;有用户使用的联想笔记本电脑出现了一些问题&#xff0c;电脑启动的时候屏幕是可以亮的&#xff0c;但是却出现错误代码&#xff0c;无法进入到系统操作界面中。那么这个情况是怎么回事呢&#xff1f;来看看以下的解…

AI根据图片自动建模

暂时放弃了&#xff0c;没显卡&#xff0c;直接装不了 用的是一个git上的老项目3年前的&#xff0c;最近更新6个月&#xff0c;由facebook开发 GitHub - facebookresearch/pifuhd: High-Resolution 3D Human Digitization from A Single Image. 他需要的环境有 Python 3PyTo…

微信xr-frame官方案例基础能力之渲染目标

前言&#xff1a;什么是渲染目标&#xff1f;&#xff08;详见&#xff1a;RenderTarget-渲染目标&#xff09; 在3D计算机图形领域&#xff0c;渲染目标是现代图形处理单元&#xff08;GPU&#xff09;的一个特征&#xff0c;它允许将3D场景渲染到中间存储缓冲区或渲染目标纹理…

视频压缩存储可以给油田带来什么好处?

航天安网监控视频压缩存储解决方案可以在不改变帧率、不改变视频分辨率、不改变时长、不损失特征点、不影响后续AI智能分析等条件下实现高清视频平均10倍以上无损压缩&#xff0c;压缩后视频文件大小平均为原文件大小的1/10&#xff0c;针对动态场景较少的环境&#xff0c;例如…

【Python】Python高校图书馆书籍管理系统(登录、注册、功能源码设计)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

ipa如何安装到iphone

这里以目前很火的奥普appuploader为例&#xff0c;先打开 appuploader&#xff0c;把 iPhone 用原装数据线连接&#xff0c;点击左侧的 appuploader一栏&#xff0c;会在右窗格中看到机器的相关信息&#xff0c;可以看到是否越狱一栏显示“是”。 接下来请点击左侧的“程序库”…

《汇编语言》- 读书笔记 - 实验1 查看 CPU 和内存,用机器指令和汇编指令编程

《汇编语言》- 读书笔记 - 实验1 查看 CPU 和内存&#xff0c;用机器指令和汇编指令编程 实验 1 查看 CPU 和内存&#xff0c;用机器指令和汇编指令编程1. 预备知识: Debug 的使用r 修改或显示寄存器的值d 查看内存数据e 编辑内存中指定地址的内容u 显示代码t 单步执行一条指令…

oa系统是什么?oa系统怎么用?

阅读本文你将了解&#xff1a;1.oa系统是什么&#xff1b;2.oa系统怎么用&#xff08;oa系统功能模块&#xff09;3.oa系统作用&#xff08;案例&#xff09; 一、oa系统是什么 oa系统全称为Office Automation&#xff0c;即办公自动化系统。它是一种专门为企业和机构的日常办…

Redis和数据库数据不一致该怎么做?

Redis和数据库数据不一致该怎么做&#xff1f; 答&#xff1a; 情景&#xff1a;redis作为缓存&#xff0c;当我们修改数据库的数据的时候&#xff0c;会出现Mysql和redis的数据不一致的问题 如图&#xff0c;当修改更新MYSQL数据为9后&#xff0c;还没来得及取更新redis&am…

linux系列小知识-手把手教你SSH怎么链接

目录 项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 项目场景&#xff1a; 应用场景&#xff1a;在机器装机后&#xff0c;如果没有显示&#xff0c;有没有串口&#xff0c;通常很难区操作调试&#xff0c;本文总结一篇通过搭建SSH链接去为调试…

操作符讲解2---C语言

目录 前言&#xff1a; 1.赋值操作符 2.单目操作符 2.1取地址操作符 2.2sizeof操作符 2.3和-- 3.关系操作符 4.条件表达式和逗号表达式 4.1条件表达式 4.2逗号表达式 5.下标引用&函数调用&结构访问 6.表达式与语句的关系 ❤博主CSDN:啊苏要学习 ▶专栏分类…

跨境电商卖家,如何运营Facebook?

随着跨境电商的兴起&#xff0c;越来越多的卖家开始运营Facebook&#xff0c;以吸引更多的潜在客户和提高品牌知名度。那么&#xff0c;作为跨境电商卖家&#xff0c;我们可以在Facebook上做些什么呢&#xff1f; 首先&#xff0c;我们可以通过Facebook建立一个专业的品牌页面&…

测试岗人员转型已是必然选择:我的十年自动化测试经验分享

目录 做测试十多年&#xff0c;有不少人问过我下面问题&#xff1a; 第一阶段&#xff1a;初级测试工程师 第二阶段&#xff1a;中级测试工程师 第三阶段&#xff1a;高级测试工程师/测试组负责人 第四阶段&#xff1a; 测试专家/测试经理 升华阶段(老手后5年—10年) 提…

搞怪独特的520文案表情包分享来啦

1. 你宁愿做狗也不和我表白&#xff0c;这个仇我记下了。 2. 这个夏天我不再是单身狗&#xff0c;请叫我热狗。 3. 我以为520是什么日子呢&#xff0c;特意去查了下史书&#xff0c;520是农历的四月初六潘金莲毒死武大郎的日子。 4. 520 你跟她过吧&#xff0c;我没借到钱&…

经常说的数据仓库,是如何存储数据的

一、 什么是数据仓库&#xff1f; 数据仓库(Data Warehouse)&#xff0c;简称DW。数据仓库顾名思义&#xff0c;是⼀个很⼤的数据存储集合&#xff0c;出于企业的分析性报告和决策⽀持⽬的⽽创建&#xff0c;对多样的业务数据进⾏筛选与整合。它能为企业提供⼀定的BI&#xff…

CVPR 2023 | EfficientViT:让ViT在多个部署场景实现实时推理

随着近两年来对视觉Transformer模型&#xff08;ViT&#xff09;的深入研究&#xff0c;ViT的表达能力不断提升&#xff0c;并已经在大部分视觉基础任务 (分类&#xff0c;检测&#xff0c;分割等) 上实现了大幅度的性能突破。 然而&#xff0c;很多实际应用场景对模型实时推理…

从零入门激光SLAM(十)——刚体位姿表达与优化

大家好呀&#xff0c;我是一个SLAM方向的在读博士&#xff0c;深知SLAM学习过程一路走来的坎坷&#xff0c;也十分感谢各位大佬的优质文章和源码。随着知识的越来越多&#xff0c;越来越细&#xff0c;我准备整理一个自己的激光SLAM学习笔记专栏&#xff0c;从0带大家快速上手激…