【QT】窗口MainWindow

news2024/9/20 20:18:49

目录

窗口的组成

菜单栏

图形化创建菜单栏

代码创建菜单栏

给菜单设置快捷键 

添加子菜单

添加分割线 

添加图标 

创建menuBar的细节

工具栏

设置工具栏出现的初始位置(上下左右) 

设置工具栏允许停靠的位置

设置不允许浮动

设置不允许移动

状态栏

创建状态栏

显示实时消息

给状态栏添加子控件

浮动窗口 

1. 给主窗口添加一个浮动窗口(子窗口)

2. 给浮动窗户设置标题

3.给浮动窗口内部,添加一些其他控件

4. 设置浮动窗口的停靠位置 

对话框

对话框介绍

分类 

内存释放问题

创建对话框

自定义对话框

通过代码实现自定义

通过图形化自定义

模态对话框

 消息对话框

1. 创建消息对话框

2. 设置对话框窗口标题和文本

3.设置对话框风格

 4.设置对话框包含的按钮

5. 获取用户点击哪个按钮

简便写法

颜色对话框

常用方法

使用示例:基于用户选择的颜色,修改窗口的背景色 

文件对话框

常用方法

字体对话框

使用示例:基于用户选择的font属性,设置button的字体

输入对话框


窗口的组成

        Qt中窗口是通过QMainWindow类来实现的,QMainWindow是一个为用户提供主程序的类,继承自QWidget类,并且提供了⼀个预定义的 布局。QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部件)(dock widgets 也就是子窗口)、⼀个状态栏(status bar) 和⼀个 中⼼部件(central widget)

菜单栏跟工具栏的区别 :
菜单栏如下:

工具栏如下:

 工具栏中本质上就是菜单栏中一些选项的快捷方式。

菜单栏

一个主窗口最多只能有一个菜单栏。

菜单项通过QAction类实现。

图形化创建菜单栏

在 这里的 “在这里输入” 是新建一个菜单页

在文件下拉选项中的 是新建一个菜单项 

代码创建菜单栏

1. 创建菜单栏

    QMenuBar* menuBar = new QMenuBar();
    this->setMenuBar(menuBar);

2. 创建菜单

    QMenu* menu1 = new QMenu("文件");
    QMenu* menu2 = new QMenu("编辑");
    QMenu* menu3 = new QMenu("视图");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);

3. 给菜单添加菜单项

    QAction* action1 = new QAction("新建");
    QAction* action2 = new QAction("打开");
    QAction* action3 = new QAction("保存");
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addAction(action3);

4. 给action添加信号槽

connect(action1,&QAction::triggered,this,&MainWindow::handle);

5. 效果如下:

给菜单设置快捷键 

设置好的快捷键搭配alt就可以进行使用了

QMenu* menu1 = new QMenu("文件(&F)");

通过给文本设置 “ (&F)” 即可设置快捷键,与QLabel设置伙伴类似。

菜单项的快捷键与这一样。

添加子菜单

菜单栏通过 addMenu 添加菜单,菜单也是通过addMenu 添加子菜单。

示例:

    QMenuBar* menuBar = new QMenuBar();
    this->setMenuBar(menuBar);

    QMenu* menuParent = new QMenu("父菜单");
    QMenu* menuChild = new QMenu("子菜单");
    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");;


    menuBar->addMenu(menuParent);
    menuParent->addMenu(menuChild);

    menuParent->addAction(action1);
    menuParent->addAction(action2);

效果如下: 

添加分割线 

菜单里菜单项特别多,就可以通过分割线,进行分组。

QMenu中提供了 addSeparator 函数。

这是添加分割线之前的效果:

添加之后: 

代码如下:

    menuParent->addAction(action1);

    menuParent->addSeparator();

    menuParent->addAction(action2);

通过这个分割线,可以把菜单中若干个菜单项分成几个部分,以达到更好的用户体验效果。

添加图标 

这里涉及到之前所介绍的QIcon类和qrc机制。

代码如下:

    QAction* action1 = new QAction("编辑");
    action1->setIcon(QIcon(":/edit.png"));

效果如下:

菜单也可以设置图标,但是如果给QMenu设置图标 ,当前的QMenu是长在QMenuBar上的,此时文本就不显示,图标覆盖了文本,如果当前的QMenu是子菜单,图标和文本是都能显示的。

创建menuBar的细节

    QMenuBar* menuBar = new QMenuBar();
    this->setMenuBar(menuBar);

上述代码中,在一些多线程之类的情况下,可能会出现原本窗口已经有了菜单栏,我们在进行设置菜单栏的话,会导致原本的菜单栏脱离对象树,从而导致后续内存泄漏。

因此我们可以规范一下创建菜单栏的写法:

    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);

上述代码写法的好处:

  1. 如果QMenuBar已经存在,直接获取并返回。
  2. 如果QMenubar不存在,就先创建一个新的,再返回。

如果是获取到已经存在的QMenuBar,后面的设置就是自己替换自己,还在对象树上。

工具栏

qt中使用QToolBar表示工具栏对象,一个窗口可以有多个工具栏,也可以没有,同时工具栏往往可以手动移动位置。
使用示例:

    QToolBar* toolBar = new QToolBar();

    this->addToolBar(toolBar);

    QAction* action1 = new QAction("保存");
    action1->setIcon(QIcon(":/edit.png"));

    toolBar->addAction(action1);

效果:

可以从上述效果中看出,文本被图标所覆盖,但是我们设置的文本并没有消失 ,而是变成tooltip存在。

设置工具栏出现的初始位置(上下左右) 

  • Qt::LeftToolBarArea 停靠在左侧
  • Qt::RightToolBarArea 停靠在右侧
  • Qt::TopToolBarArea 停靠在顶部
  • Qt::BottomToolBarArea 停靠在底部
  • Qt::AllToolBarAreas 以上四个位置都可停靠

示例:

    QToolBar* toolBar = new QToolBar();

    this->addToolBar(Qt::LeftToolBarArea,toolBar);

设置工具栏允许停靠的位置

示例:允许左侧和右侧停靠

toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea)

设置不允许浮动

    toolBar->setFloatable(false);

设置不允许移动

    toolBar->setMovable(false);

状态栏

状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗⼝的最底部,⼀个窗⼝中最多只能有⼀个状态栏。在 Qt 中,状态栏是通过 QStatusBar类 来实现的。 在状态栏中可以显⽰的消息类型有:
  • 实时消息:如当前程序状态
  • 永久消息:如程序版本号,机构名称
  • 进度消息:如进度条提⽰,百分百提⽰

创建状态栏

用如下的方式创建状态栏,若原本状态来就存在就获取即可,不存在就创建一个。

    QStatusBar* statusBar = this->statusBar();
    this->setStatusBar(statusBar);

显示实时消息

第二个参数为显示的时间,如下是显示2秒,如果为0或者不填,则消息永久存在。

statusBar->showMessage("hello",2000);

给状态栏添加子控件

addWidget( ) 在状态栏左侧添加控件

addPermanentWidget( ) 在状态栏右侧添加控件

    statusBar->addWidget(label1);
    statusBar->addPermanentWidget(label2);

效果如下:

浮动窗口 

浮动窗口也就是子窗口。

Qt中使用QDockWidget 来实现的。

1. 给主窗口添加一个浮动窗口(子窗口)

    QDockWidget* dockWidget = new QDockWidget();
    this->addDockWidget(Qt::LeftDockWidgetArea,dockWidget);

2. 给浮动窗户设置标题

dockWidget->setWindowTitle("这是浮动窗口");

3.给浮动窗口内部,添加一些其他控件

        不能直接给这个浮动窗口添加子控件,而是需要创建出一个单独的QWidget,把要添加的控件加入到QWidget中。,然后再把这个QWidget设置到dockWidget中。

        由于dockWidget中只能包含一个QWidget,想要添加更多控件只能往这个QWidget中进行添加了。

    QWidget* container = new QWidget();
    dockWidget->setWidget(container);

    QVBoxLayout* layout = new QVBoxLayout();
    container->setLayout(layout);

    QLabel* label = new QLabel("标签1");
    QPushButton* btn = new QPushButton("按钮");
    layout->addWidget(label);
    layout->addWidget(btn);

效果如下:

 

4. 设置浮动窗口的停靠位置 

浮动窗⼝是位于中⼼部件的周围。可以通过 QDockWidget类 中提供 setAllowedAreas() 函数设置其
允许停靠的位置。其中可以设置允许停靠的位置有:
  • Qt::LeftDockWidgetArea 停靠在左侧
  • Qt::RightDockWidgetArea 停靠在右侧
  • Qt::TopDockWidgetArea 停靠在顶部
  • Qt::BottomDockWidgetArea 停靠在底部
  • Qt::AllDockWidgetAreas 以上四个位置都可停靠

示例:设置浮动窗口只允许上下停靠

dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

对话框

对话框介绍

        对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤⼾交互。Qt⽤的内置对话框有:QFiledialog(⽂件对话框)QColorDialog(颜⾊对话框)QFontDialog (字体对话框)QInputDialog (输⼊对话框)QMessageBox(消息框) 。  

分类 

对话框分为模态对话框和非模态对话框。

内存释放问题

因为dialog可以存在多个,可能会存在内存泄漏的问题,所以我们应该让用户点击 对话框关闭按钮的时候,触发delete操作。

 dialog->setAttribute(Qt::WA_DeleteOnClose);

创建对话框

1. 创建对话框

QDialog* dialog = new QDialog(this);

2. 设置对话框标题 

dialog->setWindowTitle("对话框的标题");

3. 设置对话框尺寸 

dialog->resize(400,300);

4. 显示对话框

dialog->show();

5. 设置delete属性

dialog->setAttribute(Qt::WA_DeleteOnClose);

自定义对话框

        要想自定义对话框,就需要继承QDialog创建类。

通过代码实现自定义

这里我们新建一个类,如下:

 1. Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QWidget>
#include <QDialog>
class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget* parent);
    void handle();
};

#endif // DIALOG_H

 2. Dialog.cpp

#include "dialog.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
Dialog::Dialog(QWidget* parent):QDialog(parent)
{
    QVBoxLayout* layout = new QVBoxLayout();
    this->setLayout(layout);

    QLabel* label = new QLabel("这是一个对话框",this);
    QPushButton* btn = new QPushButton("关闭",this);
    layout->addWidget(label);
    layout->addWidget(btn);

    connect(btn,&QPushButton::clicked,this,&Dialog::handle);

}

void Dialog::handle()
{
    this->close();
}

3. 调用

void MainWindow::on_pushButton_clicked()
{
    Dialog* dialog = new Dialog(this);

    dialog->setWindowTitle("这是自定义对话框");
    dialog->resize(400,300);

    dialog->show();
}

4. 效果 

通过图形化自定义

1. 新建一个Qt设计师界面

2.选择模板 

3.这样会多出来一个ui文件

4. 在dialog 的ui文件中设计自定义对话框即可 

模态对话框

模态:弹出对话框的时候,此时用户无法操作父窗口,必须得完成对话框内部出的操作,关闭对话框之后,才可操作父窗口。

非模态:弹出对话框的时候,用户可以操作父窗口。

那么我们如何产生模态对话框呢?

把前面 .show方法换成exec即可。

dialog->exec();

 消息对话框

消息对话框 QMessageBox,消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为⽤⼾提⽰重要信息,强制⽤⼾进⾏选择操作。

1. 创建消息对话框

QMessageBox* message = new QMessageBox(this);

2. 设置对话框窗口标题和文本

   message->setWindowTitle("对话框窗口标题");
   message->setText("这是对话框文本");

3.设置对话框风格

QMessageBox类 中定义了静态成员函数,可以直接调⽤创建不同⻛格的消息对话框,其中包括:
Question
⽤于正常操作过程中的提问
Information
⽤于报告正常运⾏信息
Warning
⽤于报告⾮关键错误
Critical
⽤于报告严重错误
 message->setIcon(QMessageBox::Warning);

 4.设置对话框包含的按钮

message->setStandardButtons(QMessageBox::Ok | QMessageBox::Save);

除了使用系统提供按钮,我们也可以添加自己的按钮 ,在添加按钮的时候,可以设置按钮的角色

代码如下:

    QPushButton* btn = new QPushButton("按钮",messageBox);
    messageBox->addButton(btn,QMessageBox::AcceptRole);

也可以给这个按钮绑定信号槽来使用。 

5. 获取用户点击哪个按钮

        用户点击按钮,使对话框关闭之后,此时就能通过exec的返回值,来知道用户点击的是哪个按钮,从而执行一些对应的逻辑。

        以下是系统自带的按钮:

代码示例:

    int result = messageBox->exec();
    if(result == QMessageBox::Ok){
        qDebug()<<"ok"<<endl;
    }

因为QMessageBox的使用场景一般是模态的,所以我们使用exec方法

简便写法

通过warning这个静态函数,可以快速的构造出一个消息对话框。 

    int result = QMessageBox::warning(this,"对话框标题","对话框文本",QMessageBox::Ok | QMessageBox::No);
    if(result == QMessageBox::Ok){
        qDebug()<<"ok"<<endl;
    }

另外三种也可以通过上述的方法。

颜色对话框

QColorDialog颜⾊对话框的功能是允许用户选择颜⾊。继承⾃ QDialog 类。颜⾊对话框如下图示:

常用方法

1、 QColorDialog (QWidget *parent = nullptr) //创建对象的同时设置⽗对象
2、 QColorDialog(const QColor &initial, QWidget *parent = nullptr) //创建对象的同时通过QColor
对象设置默认颜⾊和⽗对象
3、 void setCurrentColor(const QColor &color) //设置当前颜⾊对话框
4、 QColor currentColor() const //获取当前颜⾊对话框
5、 QColor getColor(const QColor &initial = Qt::white,
                                 QWidget *parent = nullptr,
                                 const QString &title = QString(),
                                 QColorDialog::ColorDialogOptions options = ColorDialogOptions()) //打开颜⾊选择对话框,并返回⼀个QColor对象
参数说明:
                initial:设置默认颜⾊
                parent:设置⽗对象
                title:设置对话框标题
                options:设置选项
           
6、 void open(QObject *receiver, const char *member) //打开颜⾊对话框

使用示例:基于用户选择的颜色,修改窗口的背景色 

QColor(ARGB 1, 0.541176, 0.27451, 1) 

第一个参数为不透明度,1 为不透明 ,接下去的参数为red 、green 、blue

    QColor color =  QColorDialog::getColor(QColor(0,255,0),this,"选择颜色");
    qDebug()<<color;

    QString style = "background-color: rgb(" + QString::number(color.red()) + "," +
                    QString::number(color.green()) + "," +QString::number(color.blue()) + ");";
    this->setStyleSheet(style);

文件对话框

QFileDialog⽂件对话框⽤于应⽤程序中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件。

常用方法

1、打开⽂件(⼀次只能打开⼀个⽂件)
QString getOpenFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
2、打开多个⽂件(⼀次可以打开多个⽂件)
QStringList getOpenFileNames (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
3、 保存⽂件
QString getSaveFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
参数说明:
        参数1: parent ⽗亲
        参数2: caption 对话框标题
        参数3: dir 默认打开的路径
        参数4: filter ⽂件过滤器

此处的打开/保存功能需要额外去实现的,并不是说直接一按保存就真的保存了

代码示例:

返回文件路径

    QString filePath = QFileDialog::getOpenFileName(this);
    QString filePath = QFileDialog::getSaveFileName(this);

字体对话框

Qt 中提供了预定义的字体对话框类 QFontDialog,⽤于提供选择字体的对话框部件。
代码示例:
   bool ok = false;
   QFont font = QFontDialog::getFont(&ok);
   
   qDebug()<<font.family();
   qDebug()<<font.pointSize();
   qDebug()<<font.bold();
   qDebug()<<font.italic();

使用示例:基于用户选择的font属性,设置button的字体

ui->pushButton->setFont(font);

输入对话框

让用户输入一个具体的数据,可以是整数、浮点数,也可以是字符串。

1、双精度浮点型输⼊数据对话框
double getDouble (QWidget *parent, const QString &title, const QString &label, double
value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
2、整型输⼊数据对话框
int getInt (QWidget *parent, const QString &title, const QString &label, int value = 0, int
min = -2147483647, int max = 2147483647, int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
3、选择条⽬型输⼊数据框
QString getItem (QWidget *parent, const QString &title, const QString &label, const
QStringList &items, int current = 0, bool editable = true, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone) ;
参数说明:
                parent:⽗亲
                title:对话框标题
                label:对话框标签
                items:可供选择的条⽬
返回值为用户输入的值
字符串数组 QStringList item

这里演示条目输入框的用法:

    QStringList items;
    items.push_back("111");
    items.push_back("222");
    items.push_back("333");
    QString item = QInputDialog::getItem(this,"条目输入对话框","请输入条目",items);

 效果如下:

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

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

相关文章

【STM32项目】基于嵌入式智能网控微嵌式远距操控平台(完整工程资料源码)

基于嵌入式智能网控微嵌式远距操控平台 目录&#xff1a; 前言: 一、项目前景调研 1.1 研究背景及意义 1.2 国内外发展现状及趋势 1.2.1 国内现状 1.2.2 国外发展现状 1.2.3 发展趋势 二、什么是嵌入式&#xff1f; 2.1 嵌入式系统概述 2.2 嵌入式系统的组成 2.3 嵌入式操作系统…

camera-qsc-crosstalk校准数据XTALK回写

问题背景 手机越做越紧凑&#xff0c;需要模组和芯片尺寸越做越小&#xff0c;在尺寸一定的基础上&#xff0c;高像素和大像素&#xff0c;对于手机摄像头来说&#xff0c;一直是一对矛盾的存在。 高像素&#xff1a;带来高分辨率画质大像素&#xff1a;带来暗态下高感光度和…

【java】力扣 反转链表

力扣 206 链表反转 题目介绍 解法讲解 先定义两个游标indexnull&#xff0c;prenull&#xff0c;反转之后链表应该是5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1&#xff0c;我们先进行2->1的反转&#xff0c;然后再循坏即可 让定义的游标index去存储head.n…

RocketMQ~消息的种类与生命周期(普通消息、延时定时消息、事务消息)

普通消息 普通消息一般应用于微服务解耦、事件驱动、数据集成等场景&#xff0c;这些场景大多数要求数据传输通道具有可靠传输的能力&#xff0c;且对消息的处理时机、处理顺序没有特别要求。 以在线的电商交易场景为例&#xff0c;上游订单系统将用户下单支付这一业务事件封…

im即时通讯系统有哪些?

IM即时通讯系统是一种通过互联网和移动通信网络实现实时通信的系统。在众多IM即时通讯系统中&#xff0c;WorkPlus作为企业级IM即时通讯系统&#xff0c;提供了全面的通讯和协作解决方案。本文将介绍几种常见的IM即时通讯系统&#xff0c;以及WorkPlus作为企业级IM即时通讯系统…

第三方配件也能适配苹果了,iOS 18与iPadOS 18将支持快速配对

苹果公司以其对用户体验的不懈追求和对创新技术的不断探索而闻名。随着iOS 18和iPadOS 18的发布&#xff0c;苹果再次证明了其在移动操作系统领域的领先地位。 最新系统版本中的一项引人注目的功能&#xff0c;便是对蓝牙和Wi-Fi配件的配对方式进行了重大改进&#xff0c;不仅…

【自动驾驶汽车通讯协议】UART通信详解:理解串行数据传输的基石

文章目录 0. 前言1. 同步通讯与异步通讯1.1 同步通信1.2 异步通信 2. UART的数据格式3. 工作原理3.1 波特率和比特率3.2 UART的关键特性 4. UART在自动驾驶汽车中的典型应用4.1 UART特性4.2应用示例 5. 结语 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自…

html5——列表、表格

目录 列表 无序列表 有序列表 自定义列表 表格 基本结构 示例 表格的跨列 表格的跨行 列表 无序列表 <ul>【声明无序列表】 <li>河间驴肉火烧</li>【声明列表项】 <li>唐山棋子烧饼</li> <li>邯郸豆沫</li> <l…

pyinstaller教程(二)-快速使用(打包python程序为exe)

1.介绍 PyInstaller 是一个强大的 Python 打包工具&#xff0c;可以将 Python 程序打包成独立的可执行文件。以下会基于如何在win系统上将python程序打包为exe可执行程序为例&#xff0c;介绍安装方式、快速使用、注意事项以及特别用法。 2.安装方式 通过 pip 安装 PyInstal…

随笔-不是来养老的吗

来了有一个多月了&#xff0c;日子过得飞快。都以为我来养老的&#xff0c;一开始我也这么认为&#xff0c;结果6月份的日均工时&#xff0c;排在了部门第一。一个月做的需求比之前的三个月都多。 来之前&#xff0c;老徐让我多承担点&#xff0c;想着能有多少活嘛&#xff0c…

QT TCP多线程网络通信

学习目标&#xff1a; TCP网络通信编程 学习前置环境 运行环境:qt creator 4.12 QT TCP网络通信编程-CSDN博客 Qt 线程 QThread类详解-CSDN博客 学习内容 使用多线程技术实现服务端计数器 核心代码 客户端 客户端&#xff1a;负责连接服务端&#xff0c;每次连接次数1。…

sklearn之神经网络学习算法

文章目录 什么是神经网络人工神经网络的结构输入层输出层隐含层神经元的链接 近几年深度学习还是比较火的&#xff0c;尤其是在大语言模型之后&#xff0c;在本质上深度学习网络就是层数比较多的神经网络。sklearn并不支持深度学习&#xff0c;但是支持多层感知机&#xff08;浅…

安全测试理论

安全测试理论 什么是安全测试&#xff1f; 安全测试&#xff1a;发现系统安全隐患的过程安全测试与传统测试区别 传统测试&#xff1a;发现bug为目的 安全测试&#xff1a;发现系统安全隐患什么是渗透测试 渗透测试&#xff1a;已成功入侵系统为目标的的攻击过程渗透测试与安全…

自动驾驶事故频发,安全痛点在哪里?

大数据产业创新服务媒体 ——聚焦数据 改变商业 近日&#xff0c;武汉城市留言板上出现了多条关于萝卜快跑的投诉&#xff0c;多名市民反映萝卜快跑出现无故停在马路中间、高架上占最左道低速行驶、转弯卡着不动等情况&#xff0c;导致早晚高峰时段出现拥堵。萝卜快跑是百度 A…

配置与管理Samba服务器(详细教程)

目录 一、基础理论 二、samba工作流程 三、项目实训 3.1目的 3.2准备工作 3.2.1服务器安装samba服务软件包 3.2.2客户端安装软件包 3.3配置Samba服务 3.3.1开启Samba服务&#xff0c;并设置开启自启动 3.3.2创建共享文件夹 3.3.3创建群组 3.3.4修改文件用户权限 3.3.5修改…

LabVIEW人工模拟肺控制系统开发

开发了一种创新的主被动一体式人工模拟肺模型&#xff0c;通过LabVIEW开发的上位机软件&#xff0c;实现了步进电机驱动系统的精确控制和多种呼吸模式的模拟。该系统不仅能够在主动呼吸模式下精确模拟快速呼吸、平静呼吸和深度呼吸&#xff0c;还能在被动模式下通过PID控制实现…

训练CDN基础代码

文章目录 时间整体流程训练细节小结 时间 从开始在平台上搭建到现在可以在平台上训练已经4天了 有GPU平台一般是autoDL平台&#xff0c;白嫖200元平台是&#xff1a;https://cloud.lanyun.net/ 整体流程 1.注册平台&#xff0c;以蓝耘为例子 卡从好变坏依次是&#xff1a;…

C语言:指针详解(5)

目录 一、sizeof()函数和strlen()函数的对比 1.sizeof()函数 2.strlen()函数 3.sizeof()函数和strlen()函数的对比 二、数组和指针笔试试题解析 1.一维数组 2.字符数组 &#xff08;1&#xff09;代码1 &#xff08;2&#xff09;代码2 &#xff08;3&#xff09;代码…

【数组、特殊矩阵的压缩存储】

目录 一、数组1.1、一维数组1.1.1 、一维数组的定义方式1.1.2、一维数组的数组名 1.2、二维数组1.2.1、二维数组的定义方式1.2.2、二维数组的数组名 二、对称矩阵的压缩存储三、三角矩阵的压缩存储四、三对角矩阵的压缩存储五、稀疏矩阵的压缩存储 一、数组 概述&#xff1a;数…

香橙派AIpro:体验强劲算力,运行ROS系统

文章目录 前言一、香橙派AIpro开箱及功能介绍1.1香橙派AIpro开箱1.2香橙派AIpro功能介绍 二、香橙派AIpro资料下载及环境搭建2.1资料下载2.2环境搭建2.3使用串口启动进入开发板2.4使用HDMI线接入屏幕启动 三、部署ROS系统四、香橙派AIpro的使用和体验感受 前言 本篇文章将带体…