Qt 窗口

在Qt Creator 中创建项目的时候,我们能够选择创建QMainWindow 还是 QWidget 两种窗口。

二者有什么区别呢?其中 QMainWindow 是一种主窗口,包含菜单栏,工具栏,状态栏,中心窗口和浮动窗口等多个窗口组合,它继承自QWidget类,提供了一个预定义的布局。这就是二者的区别。 

一个成熟的窗口,必然包含菜单栏、工具栏、状态栏等多个窗口组合在一起,因此我们使用 Qt 创建一个窗口时,必然需要考虑这些要素,那么本文我们就来学习如何创建一个成熟的Qt窗口吧。

菜单栏

Qt 中,菜单栏采用 QMenuBar 这个类实现,一个菜单栏中可以包含多个菜单,而一个菜单中又包含多个菜单项或者子菜单。

  • QMenuBar : 菜单栏类
  • QMenu:菜单类
  • QAction : 菜单项类

我们可以通过 Qt Designer 来创建一个菜单栏。(注意,必须是 QMainWindow 才行)

 在 Qt Designer 中的左上角,点击 "在这里输入即可在菜单栏这里添加菜单,添加完菜单后即可点击下面的 "在这里输入" 即可添加菜单项,也可以继续输入来添加子菜单。

不过这里有一个 Bug,即无法输入中文,只能采用复制粘贴的方式来输入中文。

添加菜单栏、菜单和菜单项 

此外,也可以通过代码的形式来添加菜单。

 

能够获取到确实添加了菜单栏、菜单和菜单项。 

添加快捷键

在 Qt 的菜单栏中,我们可以通过快捷键来快速选取,比如下面的菜单可以通过 Alt + F 来选取文件菜单Alt + E 来选取编辑菜单按下对应的快捷键直接选取菜单项,我们也能够自行设置快捷键方便我们使用。

和 label 控件一样,都是通过 & + 快捷键的方式来设置对应的快捷键,这样就能够通过 Alt + 快捷键的方式选中菜单了。不过有一点需要注意,同时出现的快捷键之间不能重名,比如菜单之间的快捷键不能相同,但是不同菜单下的菜单项的快捷键可以相同。

 

三个菜单项被选中就会输出对应的消息。 

可以看到确实被选中了并且输出了消息。

添加子菜单

一般菜单中也会嵌套子菜单,比如 Qt 的文件中,就存在访问最近打开文件的子菜单,我们也能够手动添加子菜单。

先创建一个新的 QMenu 对象,并且添加菜单项,然后将该 QMenu 对象添加到某个菜单下面,就添加了一个子菜单。

 这样就能够看到一个子菜单。

添加图标

有的窗口能够显示出图标,比如浏览器的收藏夹。

这些网站就有它们自己的图标,我们也能给自己的菜单添加图标。

 通过 qrc 机制获取图片,然后设置给对应的菜单项。

可以看到图标已经被设置好了。 

 不过一般菜单是不设置图标的,比如这里可以看到给一个菜单设置了图标。

但是图标将文字覆盖了,因此菜单不设置图标。 

添加分割线

QMenu 类中有一个函数叫 addSeparator() ,它会添加一个分割线。

比如这里在添加菜单项的时候,中间添加一个分割线。

能够看到在保存和打开之间多出了一条很浅的分割线。 

 QMenuBar 的一些问题

在上面的代码中,我们都是先创建一个 QMenuBar,然后再设置即可,但是这是有一点问题的。

在创建项目的时候,没有勾选自动生成ui文件的时候,这里是没问题的,而如果勾选了生成 ui 文件的时候,就会出现内存泄漏,比如我这里是勾选了自动生成 ui 文件了的。

Qt 会自动生成一个 QMenuBar 对象,并且挂在 MainWindow 上,而如果按照我上面的代码写,那么我们手动生成的 QMenuBar 对象就会替换掉自动生成的 QMenuBar 对象,这个自动生成的 QMenuBar 就不存在对象树上了,那么它就无法自动释放,就会造成内存泄漏。

为了针对这个问题,我们可以采用其他方式创建 QMenuBar 对象。

即通过 this->menuBar() 来获取this自带的menuBar,如果自动生成了,那么我们就获取到了这个 menuBar,没有创建新的资源,自动生成的 menuBar 就不会出问题了。

而如果没有自动生成 menuBar,就会自动生成然后返回。

 这样两者方式都没有造成内存泄漏。

工具栏

工具栏一行包含一系列快捷工具,一般都是菜单栏中的常用菜单项,因此工具栏的工具项一般和菜单项都采用 QAction 类,都是通用的。

而一个窗口可以含有0个或者多个工具栏,这些工具栏的位置可以随时拖动修改,也就是所谓的浮动态。

创建工具栏并添加工具

和菜单栏不同,工具栏能够同时存在多个,因此添加工具栏的函数是 addToolBar 而非 setToolBar

而工具项和菜单项都是类似的,因此都是用的 QAction 类。

设置工具栏位置

工具栏和菜单栏不同,工具栏可以自由设置不同的位置,在添加工具栏的时候可以设置位置。 

 一般可以添在四种位置,默认在上方。

  • Qt::LeftToolBarArea  :  左侧
  • Qt::RightToolBarArea : 右侧
  • Qt::TopToolBarArea : 上侧
  • Qt::BottomToolBarArea : 底侧
  • Qt::AllToolBarArea : 四个位置都能停靠

除了在添加工具栏的时候 ,我们也能够设置工具栏允许停靠的位置。

通过 setAllowedAreas 可以设置允许其停靠的位置,比如下面的代码就允许停靠 左右区域。

可以发现,虽然刚开始的时候工具栏在上方,但是一旦拖动之后就无法回到上方了。 

  • addToolBar : 是设定初识工具栏的位置
  • setAllowedAreas : 是设定允许工具栏停靠的位置 

其中,工具栏没有固定在某个位置时,称为浮动态,能不能浮动我们也能设置。 

设定工具项的图标

给工具栏添加工具项的时候,也可以为他设置图标,毕竟大部分工具都是采用图标显示的。

不过图标会覆盖工具项的文字,此外,最初设置的文字会变成工具项的 toolTip,即提示。

我们也能通过 setToolTip 函数设置提示信息。

设置工具栏的浮动属性

工具栏并不唯一,我们可以设置多个工具栏。

可以看到,不同的工具栏的前面都有一根竖着的线。

拖拽该线即可移动工具栏,如果拖动的工具栏没有固定在某个方向,那么该工具栏就会变成浮动态,我们也可以通过手动设置是否允许浮动。

比如这里设置 toolbar1 不可浮动。

发现第一个工具栏无法浮动 

 

设置工具栏的移动属性 

这里设置工具栏2 的移动属性为false。 

发现第二个工具栏直接没有移动的选项了。 

 

状态栏 

状态栏是位于窗口底层,用于显示程序的一些简单信息的区域。

它可以显示实时消息、永久消息或者进度条消息等。

状态栏的创建

和菜单栏一样,一个窗口只能有一个状态栏,因此它的创建只能通过 setStatusBar 设置。

设置实时消息

通过 showMessage 函数可以设置信息,其超时时间以ms为单位,如果设置超时时间为0,则默认一直显示。

 设置永久信息

一般永久信息都是通过 label 来显示的,不过有一点需要注意,这种信息会被 showMessage 的显示信息给覆盖掉,因此需要注意。

StatusBar 都能够添加控件,通过 addWidget 函数添加控件,一般所有控件都能够添加。

其次,添加控件的时候,我们能够添加控件的拉伸系数。

 可以看到第一个 label 和第二个 label 不同。

浮动窗口

一般一个窗口中可以有多个小窗口,比如 Qt Creator 就含有多个浮动窗口。 那么我们自然能够通过 Qt 来自行给一个窗口添加子窗口。

QDockWidget 类即是浮动窗口,它一般围绕在中心部件周围。

创建一个浮动窗口

和上面菜单栏工具栏一样,都是直接new 出来一个对象,然后通过 add 函数来添加浮动窗口。

和工具栏一样,浮动窗口可以有多个,因此使用 addDockWidget 来添加浮动窗口。

只不过这里的 addDockWidget 函数必须固定浮动窗口的位置。

以下就是设置浮动窗口位置的宏定义。 

  • Qt::LeftDockWidgetArea : 靠左 
  • Qt::RightDockWidgetArea : 靠右
  • Qt::TopDockWidgetArea : 靠上
  • Qt::BottomDockWidgetArea : 靠下 

 此时的浮动窗口未添加任何控件,因此没有任何功能。

为浮动窗口添加控件

子窗口添加控件有点复杂。

如果只在子窗口中添加一个控件可以直接添加,但是如果想添加多个控件的话,就必须借助 QWidget 了。

这是因为 DockWidget 一次只能包含一个 QWidget,如果想添加多个控件,就必须先添加一个 QWidget 对象,然后往 QWidget 对象中添加一个布局管理器,然后将新的控件添加到布局管理器中,最后连同布局管理器一起放在 QWidget 中。

这样就能够成功设置好想添加到子窗口的控件。

 对话框

在一些窗口的时候,有时候会弹出一些对话框,比如记事本修改文本后退出,会提示是否保存。

这种就是对话框,Qt 也提供了对话框,供我们使用。

在创建项目的时候,base class 选项选则 QDialog 就是一个对话框。

 不过这种方式我们一般不使用,因为对话框一般都是在主窗口弹出的。

比如这样,设置一个按钮,点击按钮即可弹出对话框。

不过这样有个内存泄漏的问题,每一次点击按钮都会创建一个对话框,但是这个对话框却没有delete,虽然我们挂在了对象树上,但问题是,窗口没有关闭,对象树也没有销毁,因此这里需要修改代码。

比如按下对话框的关闭按钮即可释放内存,这样就 Ok 了。

这样的操作 Qt 已经给我们提供了,即通过 setAttribute 函数,给 dialog 设置一个属性,该属性是 

WA_DeleteOnClose, 即关闭的时候自动销毁,这样就不会造成内存泄漏了。

自定义对话框

想要自定义对话框有两种方式:纯代码和图形化界面。

纯代码定义对话框

纯代码方式必须先创建一个 Dialog 类,该类继承自 QDialog 。

首先先新建一个类,该类继承自 QDialog。


 

然后在新建的类的构造函数中添加控件,这里的布局管理器不是必要的,只是为了美观。 

然后在 MainWindow 中给按钮添加槽函数,即点击按钮后显示一个对话框。 

可以看到,对话框中确实新增了按钮和 label。 

 

图形化界面定义对话框

 图形化界面方式定义对话框首先需要新建一个 ui 文件。

由于本次是创建一个 Dialog,因此就选择这三个中的任意一个。 

 这样我们就能在对话框中直接手动添加控件了。

给按钮添加槽函数。

之后在 MainWindo 的ui 文件中添加控件,并且添加槽函数。 

 

可以看到,确实能够显示出一个对话框。 

模态对话框

一般对话框分为两种对话框——模态对话框和非模态对话框。

  • 模态对话框

                出现该对话框时,不能对父窗口进行操作 

  • 非模态对话框

                出现该对话框时,可以对父窗口进行操作

当我们对一个文档进行了修改,退出的时候,一定回弹出一个对话框让我们选则是否保存

 

出现该对话框时,我们无法再对文档进行任何修改,必须做出选择,这就是一种模态对话框。

而如果想要创建一个模态对话框,就需要使用 exec() 函数而非 show() 函数.

这样就制作了一个模态对话框了。 

 

 Qt自带的对话框

有些对话框的使用场景比较经典和常用,针对这些使用场景,Qt 自定义了几种对话框,方便用户使用。

这些对话框都继承自 QDialog ,可以直接使用 QDialog 的 API。

QMessageBox

QMessageBox 自带按钮

QMessageBox 和 QDialog 的创建方式类似,都是通过 new 来开辟控件。

不过不一样的是,QMessageBox 自带图标和按钮,我们可以自行设置,也可以直接采用自带的图标和按钮。

 其中图标有以下图标:无图标、信息图标、警告图标、致命问题图标、操作问题图标等。

 按钮也有以下按钮,有很多种,根据自己需要使用。

 

弹出的对话框如下:

 对于 exec 函数,也就是模态对话框来说,它在执行结束后(对话框关闭)时会返回一个值。

该值是一个 int 类型的数据,该数据即是对话框设置的标准按钮的值。

 可以看到,确实在点击对应按钮后,就会获取到该按钮对应的值。

 通过这种方法我们也能够实现类似 connect 函数的作用,即通过判断返回值来调用函数。

像这种标准的按钮是无法使用信号槽机制的,不过 QMessageBox 也能够自定义按钮。

QMessageBox 自定义按钮

但是在添加自定义按钮的时候,我们能够看到两个参数,一个是按钮的地址,一个是 ButtonRole

 

这个 ButtonRole 指该按钮在对话框中所扮演的角色,我们可以直接查看一下ButtonRole

比如我们设置 ButtonRole 为 AcceptRole 那么点击这个按钮就表示接受的意思,RejectRole 则表示拒绝,HelpRole 表示帮助的角色,自定义的按钮需要设定好所扮演的角色。 

这里我们就随意设置一个接受的角色。 

 快速搭建一个 QMessageBox

QMessageBox 还有一种快速搭建对话框的方式,即通过 QMessageBox::information / warning /critical / question 四种函数来快速搭建。

这四个函数实际上就是 QMessageBox 自带的四种图标的名称,使用对应的函数会自带对应的图标。

四个函数的参数都一样,分别是 父节点、对话框标题、对话框文本、标准按钮,其返回值和exec函数一样,都是按下的按钮的值,可以直接判断使用。 

 这样就能够直接 new 一个图标是 information、带有 ok 和 no 两个按钮的 QMessageBox 对话框

而且通过这种方式创建的对话框都是 模态的。 

 QColorDialog

该对话框实现了一个调色板的功能,类似于画图中的调色板。

这个调色板我们能够做到像 QDialog 和 QMessageBox 一样,通过 new 创建和 delete 删除。

不过 Qt 自己提供了静态函数,类似于 QMessageBox 一样,可以快速创建一个调色板。

QColorDialog::getColor 函数,是 QColorDialog 的一个静态函数。

三个参数分别是 调色板初始颜色、函数的父指针、QColorDialog 的标题。

其中初始颜色是通过 rgb 设置或者直接使用 Qt 自带的宏设置的。

rgb 是三原色的缩写,即红色、绿色和蓝色,通过设置三种颜色的比例来构建其他所有颜色

我们设置通过调色板来设置背景颜色。

 

 这就是 QColorDialog 的作用。

QFileDialog

QFileDialog 是针对于文件的对话框,可以进行保存文件或者打开文件的操作。

它有三种静态函数,分别是 getOpenFileName(获取打开的文件名)、getSaveFileName(获取保存的文件名)、getOpenFileNames(一次打开多个文件)。

 

这三个函数的参数及其类似,分别是父节点的地址、对话框的标题、默认打开的文件路径、以及文件过滤器。

getOpenFileName 和 getOpenFileNames 的作用类似,因此不再赘述,咱们直接试试 getOpenFileName 和 getSaveFileName 两个函数。

设置两个按钮,分别是 getOpenFileName 以及 getSaveFileName 两个函数。

getSabeFileName 右下角是保存 。

 

而getOpenFileName 右下角是打开。 

不过这里的打开和保存按钮并没有效果,因为我们没有给它设定函数,因此没有作用。

QFontDialog

QFontDialog 能够弹出一个修改字体的对话框,和上面的调色板一样,都是通过静态函数进行调整

通过 QFontDialog::getFont 函数能够直接构建一个 QFontDialog 对话框。

该函数有两个参数。

 其中 第一个 ok 函数是一个输入输出型参数,因为设置字体的对话框有两个按钮——ok 和 cancel

如果点击的是 ok,那么该参数的值就会变成 true,cancel 则是 false。

因此这里的参数 ok 初始值应该是 false。

其次,该函数的返回值是一个 QFont,也就是返回在对话框中选择的字体进行返回,用来设置字体

这里的槽函数是获取到字体对话框中的字体,并且将按钮的字体修改为对应的字体。 

可以看到,确实能够设置按钮的字体。 

 

QInputDialog

 这是一个输入对话框,它有三种输入对话框:Int、Double、Item。

分别通过 getInt、getDouble、getItem 三种静态函数创建。

这三个函数的参数都很相似。

getItem/getInt/getDouble : 父节点的指针、对话框的标题、对话框的内容、初始值、最小值、最大值、每次微调的大小、ok值(QFontDialog::getFont的参数含义一样),flags 值。

由于初始值后面的内容后有默认值,因此我们可以不管。 

接着我们来使用一下三个对话框。

可以看到,条目输入框我们需要另外添加一个 QStringList 的参数,该参数类似于C++的 List<String> 类型。

 

 可以看到,三种函数的返回值都是对话框输入的值。

而条目输入框的条目们只是用作一个选择,并不一定需要是条目内容。

总结

本文总结了一个成熟的窗口应该具有的窗口,菜单栏、工具栏、状态栏、浮动窗口、对话框等。

也分别总结了Qt是如何实现它们的,以及各个函数的使用,相信会对大家的Qt学习之旅有所帮助

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vs2022 MSVC2017_64 调试Qt5.14.2源码

pdb调试文件下载路径https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5142/qt.qt5.5142.debug_info.win64_msvc2017_64/ 在vs中添加pdb文件符号路径&#xff0c;使其qt在调试时能查找到相应的符号文件。 在需要调试的解决方案下通过解决方案点击&…

引领采购数字化变革,商越科技如何帮企业穿越周期?

导读 在企业“降本增效”的路上&#xff0c;采购数字化已经站上C位。采购数字化对企业究竟带来哪些价值&#xff1f; 在中国采购数字化赛道&#xff0c;行业领军者已经出现。 正文 面对经济环境的不确定性&#xff0c;企业都在寻找能够穿越周期的确定性。 “在经济不确定的大…

【运维项目经历|023】Docker自动化部署与监控项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 问题1&#xff1a;项目周期是多久&#xff1f; 问题2&#xff1a;服务器部署架构方式及数量配置…

golang语言的gofly快速开发框架如何设置多样的主题说明

本节教大家如何用gofly快速开发框架后台内置设置参数&#xff0c;配置出合适项目的布局及样式、主题色&#xff0c;让你您的项目在交互上加分&#xff0c;也是能帮你在交付项目时更容易得到客户认可&#xff0c;你的软件使用客户他们一般都是不都技术的&#xff0c;所以当他们拿…

JAVAEE之文件IO_数据流概念,字节流:InputStream、OutputStream,字符流:reader、writer,及实例代码

什么是数据流 顾名思义&#xff0c;I 表示input&#xff0c;O 表示output&#xff0c;也就是输入输出流&#xff0c;主要是在程序与文件之间&#xff0c;用于传输数据的通道。既然要传输数据&#xff0c;那么我们需要理解文件和程序之间哪种方向的传输是输入流&#xff0c;哪种…

ros2 launch gazebo_ros gazebo.launch.py无法启动

现象&#xff1a; 我的系统是ubuntu22.04&#xff0c;ros2的版本是humble&#xff0c;当运行os2 launch gazebo_ros gazebo.launch.py命令&#xff0c;会卡死在第六行&#xff0c;gazebo也不会打开但最后单独使用gazebo则可以打开 原因&#xff1a; 没有设置环境变量 解决办法 …

开源硬件初识——Orange Pi AIpro(8T)

开源硬件初识——Orange Pi AIpro&#xff08;8T&#xff09; 大抵是因为缘&#xff0c;妙不可言地就有了这么一块儿新一代AI开发板&#xff0c;乐于接触新鲜玩意儿的小火苗噌一下就燃了起来。 还没等拿到硬件&#xff0c;就已经开始在Orange Pi AIpro 官网上查阅起资料&…

Aws CodeCommit代码仓储库

1 创建IAM用户 IAM创建admin用户&#xff0c;增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…

ARM32开发——第一盏灯

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 开发流程需求分析项目新建代码编写GPIO初始化 程序编译程序烧录烧录扩展&#xff08;熟悉&#xff09;官方烧录器烧录&#xff08;…

Java过滤特殊空格nbsp;

现象&#xff1a; 用Java处理excel文件中的以下字符串时&#xff0c;想去除此空格&#xff0c;却发现用String.trim()没有直到预期效果&#xff1a; 原因&#xff1a; 在网上找了下&#xff0c;应该是这其实是html中经常使用的一种特殊空格字符&nbsp&#xff1b; 处理&a…

LabVIEW调用外部DLL(动态链接库)

LabVIEW调用外部DLL&#xff08;动态链接库&#xff09; LabVIEW调用外部DLL&#xff08;动态链接库&#xff09;可以扩展其功能&#xff0c;使用外部库实现复杂计算、硬件控制等任务。通过调用节点&#xff08;Call Library Function Node&#xff09;配置DLL路径、函数名称和…

C/C++ 进阶(4)二叉搜索树

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 一、概念 二叉搜索树&#xff0c;又称二叉排序树&#xff08;中序是有序的&#xff09;。 性质 1、非空左子树的键值小于根节点的键值 2、非空右子树的键值大于根节点的键值 &#xff08;空树也是二叉搜…

变压器励磁涌流MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 变压器励磁涌流的产生机理 1、变压器是电力系统的关键部分&#xff0c;在实际的 运行中&#xff0c;变压器需要进行相应的充电&#xff0c;而在充电的过 程中&#xff0c;就需要进行开合闸作业。在开合闸作业…

智慧楼宇:城市生活的新篇章

在城市的喧嚣与繁华中&#xff0c;楼宇不仅是我们工作与生活的场所&#xff0c;更是智慧科技发展的前沿阵地。当传统的建筑遇上智慧的火花&#xff0c;便诞生了令人瞩目的智慧楼宇。 山海鲸可视化搭建的智慧楼宇数字孪生系统 一、智慧楼宇&#xff0c;定义未来生活 智慧楼宇不…

vue3学习使用笔记

1.学习参考资料 vue3菜鸟教程&#xff1a;https://www.runoob.com/vue3/vue3-tutorial.html 官方网站&#xff1a;https://cn.vuejs.org/ 中文文档: https://cn.vuejs.org/guide/introduction.html Webpack 入门教程&#xff1a;https://www.runoob.com/w3cnote/webpack-tutor…

【linux】docker下nextcloud安装人脸识别插件2

接上文 【linux】docker下nextcloud安装人脸识别插件-CSDN博客 由于作者不再维护此插件&#xff0c;转而开发新的插件 recognize &#xff0c;因此同步更新插件使用教程。 1、下载人脸识别app&#xff1a;recognize Recognize - Apps - App Store - Nextcloud 2、将插件recog…

Java后端模拟面试 题集⑤

1.先作个自我介绍吧 面试官您好&#xff0c;我叫张睿超&#xff0c;来自湖南长沙&#xff0c;大学毕业于湖南农业大学&#xff0c;是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。 大学里面主修的课程是Java、Python、数字图像…

Linux自动挂载服务autofs讲解

1.产生原因 2.配置文件讲解 总结&#xff1a;配置客户端&#xff0c;先构思好要挂载的目录如&#xff1a;/abc/cb 然后在autofs.master中编辑&#xff1a; /abc&#xff08;要挂载的主目录&#xff09; /etc/qwe&#xff08;在这个文件里去找要挂载的副目录&#xff0c;这个名…

【C++】入门(二):引用、内联、auto

书接上回&#xff1a;【C】入门&#xff08;一&#xff09;&#xff1a;命名空间、缺省参数、函数重载 文章目录 六、引用引用的概念引用的使用场景1. 引用做参数作用1&#xff1a;输出型参数作用2&#xff1a;对象比较大&#xff0c;减少拷贝&#xff0c;提高效率 2. 引用作为…