【QT】按钮类控件 显示类控件

目录

按钮类控件

Push Button

设置按钮图标

按钮设置快捷键

设置鼠标点击按钮重复触发

Radio Button

 单选框分组

Check Box 

显示类控件

Label

常用属性

设置文本格式

给Label设置图片 

Label标签设置边框

设置文本对齐方式

设置文本自动换行

设置文本缩进

设置边距

label设置伙伴 

LCD Number

核心属性

示例:倒计时

ProgressBar

核心属性 

示例:进度条

改变进度条的颜色 

Calendar Widget 

核心属性

重要信号 


按钮类控件

Push Button

使用QPushButton表示一个按钮,QPushButton继承自QAbstractButton,这个类是一个抽象类,是其他按钮的父类。

QAbstractButton 中, 和 QPushButton 相关性较⼤的属性  

属性说明
text按钮中的文本
icon按钮中的图标
iconSize按钮中图标的尺寸
shortCut按钮对应的快捷键
autoRepeat

按钮是否会重复触发. 当⿏标左键按住不放时,

如果设为 true, 则会持续产⽣⿏标点击事件;

如果设为 false, 则必须释放⿏标, 再次按下⿏标时才能产⽣点击事件.

(相当于游戏⼿柄上的 "连发" 效果)

autoRepeatDelay
重复触发的延时时间. 按住按钮多久之后, 开始重复触发
autoRepeatInterval
重复触发的周期.

设置按钮图标

// 创建图标
QIcon icon(":/doge.png");
// 设置图标
ui->pushButton->setIcon(icon);
// 设置图标⼤⼩
ui->pushButton->setIconSize(QSize(50, 50));

按钮设置快捷键

写法一:

这种方法比较不容易出错

ui->pushButton_up->setShortcut(QKeySequence(Qt::Key_W));
ui->pushButton_down->setShortcut(QKeySequence(Qt::Key_S));
ui->pushButton_left->setShortcut(QKeySequence(Qt::Key_A));
ui->pushButton_right->setShortcut(QKeySequence(Qt::Key_D));

写法二: 

ui->pushButton_up->setShortcut(QKeySequence("w"));
ui->pushButton_down->setShortcut(QKeySequence("s"));
ui->pushButton_left->setShortcut(QKeySequence("a"));
ui->pushButton_right->setShortcut(QKeySequence("d"));

要设置组合快捷键的话,只需要要用 + 连接

ui->pushButton_up->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_W));

 或者

ui->pushButton_right->setShortcut(QKeySequence("ctrl+d"));

设置鼠标点击按钮重复触发

键盘事件的重发触发默认开启

ui->pushButton_up->setAutoRepeat(true);

Radio Button

QRadioButton 是单选按钮. 可以让我们在多个选项中选择⼀个.
作为 QAbstractButton QWidget 的⼦类, 上⾯介绍的属性和⽤法, 对于 QRadioButton
同样适⽤.
QAbstractButton 中和 QRadioButton 关系较⼤的属性
属性说明
checkable是否能选中
checked是否已经被选中,checkable是checked的前提条件
autoExclusive

是否排他。

选中一个按钮是否会取消其他按钮的选中,对于QRadioButton来说默认是排他的

相关事件的功能:

  • clicked 表⽰⼀次 "点击"
  • pressed 表⽰⿏标 "按下"
  • released 表⽰⿏标 "释放"
  • toggled 表⽰按钮状态切换.

 单选框分组

有时候一个界面需要多个单选按钮组,组和组之间不能有排他,组内部排他,因此我们引入QButtonGroup类来进行分组

// 创建三个 QButtonGroup
QButtonGroup* group1 = new QButtonGroup ( this );
QButtonGroup* group2 = new QButtonGroup ( this );
QButtonGroup* group3 = new QButtonGroup ( this );
// QRadioButton 两两⼀组 , 放到三个 QButtonGroup .
group1-> addButton (ui->radioButton);
group1-> addButton (ui->radioButton_2);
group2-> addButton (ui->radioButton_3);
group2-> addButton (ui->radioButton_4);
group3-> addButton (ui->radioButton_5);
group3-> addButton (ui->radioButton_6);

Check Box 

QCheckBox 表⽰复选按钮. 可以允许选中多个. 和 QCheckBox 最相关的属性也是 checkable checked , 都是继承⾃ QAbstractButton .
⾄于 QCheckBox 独有的属性 tristate ⽤来实现 "三态复选框" .
判断是否选中
ui->check_box->ischecked();

获取多选框文本

ui->check_box->text(); 

显示类控件

Label

常用属性

属性说明

text 

QLabel中的文本
textFormat
⽂本的格式.
Qt::PlainText 纯⽂本
Qt::RichText 富⽂本(⽀持 html 标签)
Qt::MarkdownText    markdown 格式
Qt::AutoText 根据⽂本内容⾃动决定⽂本格式
pixmap
QLabel 内部包含的图⽚.
scaledContent
设为 true 表⽰内容⾃动拉伸填充 QLabel
设为 false 则不会⾃动拉伸
alignment
对⻬⽅式.
可以设置⽔平和垂直⽅向如何对⻬.
wordWrap
设为 true 内部的⽂本会⾃动换⾏.
设为 false 则内部⽂本不会⾃动换⾏.
indent
设置⽂本缩进. ⽔平和垂直⽅向都⽣效.
margin
内部⽂本和边框之间的边距.
不同于于 indent, 但是是上下左右四个⽅向都同时有效.
⽽ indent 最多只是两个⽅向有效(具体哪两个⽅向有效取决于 alignment )
openExternalLinks
是否允许打开⼀个外部的链接.
(当 QLabel ⽂本内容包含 url 的时候涉及到)
buddy
给 QLabel 关联⼀个 "伙伴" , 这样点击 QLabel 时就能激活对应的伙伴.
例如伙伴如果是⼀个 QCheckBox, 那么该 QCheckBox 就会被选中.

设置文本格式

    //第一个label设置成显示纯文本

    ui->label_1->setTextFormat(Qt::PlainText);

    ui->label_1->setText("这是⼀段纯⽂本");

    //第二个label设置成显示富文本

    ui->label_2->setTextFormat(Qt::RichText);

    ui->label_2->setText("<b> 这是⼀段富⽂本 </b>");

    //第三个label设置成显示 markdown

    ui->label_3->setTextFormat(Qt::MarkdownText);

    ui->label_3->setText("## 这是⼀段 markdown ⽂本");

给Label设置图片 

    //先把QLabel 设置成和窗口一样大,并且把这个QLabel左上角窗口的左上角

    //让整个QLabel铺满窗口

    QRect windowRect = this->geometry();

    ui->label->setGeometry(0,0,windowRect.width(),windowRect.height());

    QPixmap pixmap(":/1.png");

    ui->label->setPixmap(pixmap);

    //QLalel跟窗口一样大了,但是图片不一定,因此需要拉伸图片

    ui->label->setScaledContents(true);

上述代码我们是在窗口构造函数中写的,因此我们如果再对窗口进行放大缩小,图片并不能随之变化,这里可以让Wiget窗口类,重写父类(QWidget) resize 事件 (resizeEvent虚函数)

在鼠标拖动窗口尺寸的过程中,resizeEvent虚函数会被反复调用执行,每次触发一个resizeEvent事件都会调用以此对应的虚函数,调用父类的虚函数就会实际调用子类的对应的函数(多态)

代码示例:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
//这里void resizeEvent(QResizeEvent *event);private:Ui::Widget *ui;
};
#endif // WIDGET_H

 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QResizeEvent>//此处的形参event是非常有用的,这里就包含了触发这个resize事件这一时刻,窗口的尺寸的数值
void Widget::resizeEvent(QResizeEvent *event)
{ui->label->setGeometry(0,0,event->size().width(),event->size().height());
}

Label标签设置边框

设置文本对齐方式

//垂直水平居中

 ui->label_1->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

Qt::AlignHCenter :水平方向上居中

Qt::AlignVCenter :垂直方向上居中

……

多个文本对齐方式之间使用 “ | ” 

设置文本自动换行

ui->label_1->setWordWrap(true);

设置文本缩进

    ui->label_1->setWordWrap(true);

    ui->label_1->setIndent(50);

有多行时,每行都会产生缩进 

设置边距

ui->label_1->setMargin(10);

与indent不同的是,Margin是上下左右四个方向都一样的边距 

label设置伙伴 

示例界面如下:

 Qt中,QLabel中写的文本,是可以指定“快捷键”,此处快捷键的规则功能上要比QPushButton弱很多,是在文本中使用 & 跟上一个字符来表示快捷键,比如 &A ,我们可以通过键盘上的 alt+a来触发快捷键。

绑定了伙伴关系之后,通过快捷键就可以选中对应的单选按钮/复选按钮,这里的快捷键是在文本中写 &A 类似的就可以了

LCD Number

QLCDNumber 是一个专门用来显示数字的控件,类似于“老式计算机” 的效果。

核心属性

属性说明
intValue
QLCDNumber 显⽰的数字值(int).
value
QLCDNumber 显⽰的数字值(double).
和 intValue 是联动的.
例如给 value 设为 1.5, intValue 的值就是 2.
另外, 设置 value 和 intValue 的⽅法名字为 display , ⽽不是 setValue
setIntValue .
digitCount
显⽰⼏位数字.
mode
数字显⽰形式.
  1. QLCDNumber::Dec :⼗进制模式,显⽰常规的⼗进制数字。
  2. QLCDNumber::Hex :⼗六进制模式,以⼗六进制格式显⽰数字。
  3. QLCDNumber::Bin :⼆进制模式,以⼆进制格式显⽰数字。
  4. QLCDNumber::Oct :⼋进制模式,以⼋进制格式显⽰数字。
只有⼗进制的时候才能显⽰⼩数点后的内容
segmentStyle
设置显⽰⻛格.
  1. QLCDNumber::Flat :平⾯的显⽰⻛格,数字呈现在⼀个平坦的表⾯上。
  2. QLCDNumber::Outline :轮廓显⽰⻛格,数字具有清晰的轮廓和阴影效果。  
  3. QLCDNumber::Filled :填充显⽰⻛格,数字被填充颜⾊并与背景区分开
smallDecimalPoint
设置⽐较⼩的 ⼩数点

示例:倒计时

C++标准库中,没有提供定时器的实现,Boost里面提供了对应的功能

Qt中也封装了对应的定时器(结合了信号槽的机制)

QTimer 通过这个类创建出来的对象,就会产生一个timeout这样的信号,可以通过start方法来开启定时器,并且参数中设定触发timeout信号的周期,这样结合connect,把这个timeout信号绑定到需要的槽函数中,就可以执行逻辑,修改LCD Number上面的数字了

代码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handle();
private:Ui::Widget *ui;QTimer*  timer;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//初始值ui->lcdNumber->display("10");//创建一个QTimer实例timer=new QTimer(this);//把QTimer的timeout信号和咱们自己的槽函数进行连接connect(timer,&QTimer::timeout,this,&Widget::handle);//启动定时器,参数是触发timeout的周期,单位是mstimer->start(1000);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{//先拿到LCDNumber中的数字int value=ui->lcdNumber->intValue();if(value<=0){timer->stop();return;}ui->lcdNumber->display(value-1);
}

不使用QTimer的另一种写法(实际不可行)

#include "widget.h"
#include "ui_widget.h"
#include <thread>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//初始值ui->lcdNumber->display("10");int value=ui->lcdNumber->intValue();while(true){std::this_thread::sleep_for(std::chrono::seconds(1));if(value<=0){break;}ui->lcdNumber->display(--value);}
}Widget::~Widget()
{delete ui;
}

对于GUI来说,内部包含了很多的隐藏状态,Qt为了保证修改界面的过程中,线程安全是不会受到影响的,Qt禁止了其他线程直接修改界面,因此Qt为了确保线程安全,直接要求所有的对界面的修改操作,必须在主线程中完成,对于槽函数来说,默认情况下,槽函数都是由主线程调用的。

ProgressBar

使⽤ QProgressBar 表示一个进度条

核心属性 

属性说明
minimum
进度条最⼩值
maximum
进度条最⼤值
value
进度条当前值
alignment
⽂本在进度条中的对⻬⽅式
  • Qt::AlignLeft : 左对⻬
  • Qt::AlignRight : 右对⻬
  • Qt::AlignCenter : 居中对⻬
  • Qt::AlignJustify : 两端对⻬
textVisible
进度条的数字是否可⻅.
orientation
进度条的⽅向是⽔平还是垂直
invertAppearance
是否是朝反⽅向增⻓进度
textDirection
⽂本的朝向.
format
展⽰的数字格式.
  1. %p :表⽰进度的百分⽐(0-100)
  2. %v :表⽰进度的数值(0-100)
  3. %m :表⽰剩余时间(以毫秒为单位)
  4. %t :表⽰总时间(以毫秒为单位)

示例:进度条

 代码示例:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handle();
private:Ui::Widget *ui;QTimer* timer;};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);timer=new QTimer(this);connect(timer,&QTimer::timeout,this,&Widget::handle);timer->start(100);}Widget::~Widget()
{delete ui;
}void Widget::handle()
{int value=ui->progressBar->value();if(value>=100){timer->stop();return;}ui->progressBar->setValue(value+1);
}

在上述示例代码中,widget.h中用到了QTimer,但是却没在.h文件中包含<QTimer>头文件,为啥这个代码编译不会出错?例如“找不到定义”之类的?

上述问题其实是通过Qt内部提供的一个特殊技巧来实现的,在Qt中,有一个专门的头文件,这个头文件包含了Qt中所有类的“前置声明”,例如class QTimer;

Qt中问什么要使用上述的技巧,上述的技巧能解决什么问题?有啥提升呢?

主要解决的是编译速度的问题,C/C++的代码,编译速度在其他语言横向对比中,是非常慢的,因为C++编译速度慢和 #include头文件,有直接关系的,由于include关系错综复杂,因此,尽可能减少include头文件的个数,就可以有效的减少编译时间,Qt中就使用class前置声明的方式,来尽量减少头文件的包含

改变进度条的颜色 

Calendar Widget 

QCalendarWidget 表⽰⼀个 "⽇历" , 形如

核心属性

属性说明
selectDate
当前选中的日期
minimumDate
最⼩日期
maximumDate
最⼤日期
firstDayOfWeek
每周的第⼀天(也就是⽇历的第⼀列) 是周⼏
gridVisible
是否显⽰表格的边框
selectionMode
是否允许选择⽇期
navigationBarVisible
⽇历上⽅标题是否显⽰
horizontalHeaderFormat
⽇历上⽅标题显⽰的⽇期格式
verticalHeaderFormat
⽇历第⼀列显⽰的内容格式
dateEditEnabled
是否允许⽇期被编辑

重要信号 

信号说明
selectionChanged(const QDate&)
当选中的⽇期发⽣改变时发出
activated(const QDate&)
当双击⼀个有效的⽇期或者按下回⻋键时发出,形参是⼀个QDate类型,保存
了选中的⽇期
currentPageChanged(int,
int)
当年份⽉份改变时发出,形参表⽰改变后的新年份和⽉份

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

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

相关文章

Python入门-基本数据类型-字符串类型及其操作

字符串类型存储的数据是字符串&#xff0c;字符串是一个由字符构成的序列。Python字符串是不可变的 不支持动态修改。本节将对字符串进行简单介绍&#xff0c;包括字符串的定义方式、格式化、索引、切片 拼接、重复和成员归属等。 1.字符串的定义方式 1.1单行字符串 单行字符…

《概率论与数理统计》期末笔记_下

目录 第4章 随机变量的数字特征 4.1 数学期望 4.2 方差 4.3 常见分布的期望与方差 4.4 协方差与相关系教 第5章 大数定律和中心极限定理 5.1 大数定律 5.2 中心极限定理 第6章 样本与抽样分布 6.1 数理统汁的基本概念 6.2 抽样分布 6.2.1 卡方分布 6.2.2 t分布 6.…

高效利用iCloud的指南

高效利用iCloud的指南可以帮助你充分利用Apple提供的云服务&#xff0c;以下是一些关键的步骤和建议&#xff1a; 了解iCloud的基本功能 iCloud是Apple提供的云服务&#xff0c;可以安全地存储你的个人信息&#xff0c;包括照片、文件、备忘录、日历、联系人等。通过iCloud&…

JavaScript(4)——数组,常量

let和var的区别 var可以先使用再声明var声明过的变量可以重复声明 数组 声明语法&#xff1a; let 数组名 [数据1&#xff0c;数据2&#xff0c;数据3,...] 数组是按顺序保存&#xff0c;所以每个数据都有自己的编号计算机中的编号从0开始编号也叫索引或下标 数组可以存储任…

java基于ssm+jsp 高校毕业生就业满意度调查统计系统

1用户前台功能模块 高校毕业生就业满意度调查统计系统&#xff0c;在高校毕业生就业满意度调查统计系统可以查看首页、问卷、就业咨询、试卷列表、新闻资讯、留言反馈、我的、跳转到后台等内容&#xff0c;如图1所示。 图1系统首页界面图 用户登录、用户注册&#xff0c;通过…

LabVIEW代码性能优化

优化LabVIEW代码以提高软件性能是确保系统高效运行的关键。通过分析代码结构、数据管理、并行处理、内存使用和硬件资源的有效利用&#xff0c;我们可以从多个角度提升LabVIEW程序的执行速度和稳定性。 代码结构优化 模块化编程 将复杂的程序分解成多个子VI&#xff0c;每个子V…

Linux-进程间通信(IPC)

进程间通信&#xff08;IPC&#xff09;介绍 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同的进程之间传播或交换信息。IPC 的方式包括管道&#xff08;无名管道和命名管道&#xff09;、消息队列、信号量、共享内存、Socket、Stre…

纠正自己的做题习惯-认真学习理科第三天

自己的做题习惯有问题&#xff0c;自己得不断地纠正自己的做题习惯&#xff0c;自己经常题目都不看&#xff0c;就开始写题&#xff0c;结果就是自己没有办法能够良好地进行做题。 any()函数用于判断数组中是否存在满足条件的元素&#xff0c;而all&#xff08;&#xff09;函数…

LabVIEW编程控制ABB机械臂

使用LabVIEW编程控制ABB机械臂是一项复杂但十分有价值的任务。通过LabVIEW&#xff0c;可以实现对机械臂的精确控制和监控&#xff0c;提升自动化水平和操作效率。 1. 项目规划和硬件选型 1.1 确定系统需求 运动控制&#xff1a;确定机械臂需要执行的任务&#xff0c;如抓取、…

typescript定义函数的传参、返回值

Render 函数中定义函数传参 interface List {id: number;name: string; }interface Result {data: List[]; //表示由 List 接口组成的数组 }function Render(result: Result) {result.data.forEach(value > {console.log(value);}); }let result {data: [{id: 1,name: 张三…

嵌入式Linux系统编程 — 5.2 Linux系统时间与日期

目录 1 了解Linux系统时间 1.1 几种常用的时间 1.2 如何查看几种常用的时间 1.3 Linux 系统中的时间 2 time、gettimeofday获取时间 2.1 time函数 2.2 ​​​​​​​gettimeofday函数&#xff1a; 2.3 示例程序 3 时间转换函数 3.1 ctime与ctime_r函数 3.2 localti…

Unity之自定义Text组件默认属性值

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之自定义Text组件默认属性值 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01;…

普通集群与镜像集群配置

一. 环境准备 关闭防火墙和selinux&#xff0c;进行时间同步 rabbitmq-1 Rocky_linux9.4 192.168.226.22rabbitmq-2Rocky_linux9.4192.168.226.23rabbitmq-3Rocky_linux9.4192.168.226.24 修改主机名#192.168.226.22 hostnamectl set-hostname rabbitmq-1#192.168.226.22 ho…

isalpha()方法——判断字符串是否只由字母组成

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isalpha()方法用于判断字符串是否只由字母组成。isalpha()方法的格式如下&#xff1a; str.isalpha() 如果字符串中至少有一个字符并且所…

「C++系列」C++ 基本语法

文章目录 一、C 基本语法1. **预处理指令**2. **数据类型**3. **变量和常量**4. **运算符**5. **控制流语句**6. **函数**7. **数组**8. **指针和引用**9. **结构体和类**10. **输入/输出**11. **异常处理**12. **命名空间** 二、C 程序结构1. 程序流程结构2. 文件结构3. 编译预…

银河麒麟高级服务器操作系统V10SP2(X86)配置bond0的mac地址为指定子网卡的mac地址

银河麒麟高级服务器操作系统V10SP2&#xff08;X86&#xff09;配置bond0的mac地址为指定子网卡的mac地址 一 系统环境二 删除和备份原有配置2.1 down掉bond02.2 备份之前的bond配置到/root/bak2.3 删除bond配置&#xff08;网卡文件根据实际情况变化&#xff09; 三 新建bond0…

昇思25天学习打卡营第6天|MindSpore-ResNet50迁移学习

MindSpore-ResNet50迁移学习 迁移学习 图像的迁移学习是一种机器学习方法,它将已经在一个或多个源任务上训练好的预训练模型应用到新的目标任务上。这种方法的核心思想是,通过在大量数据上训练模型,学习到的特征表示可以用于其他相关任务,从而提高目标任务的性能。 应用场…

MySQL之聚簇索引和非聚簇索引

1、什么是聚簇索引和非聚簇索引&#xff1f; 聚簇索引&#xff0c;通常也叫聚集索引。 非聚簇索引&#xff0c;指的是二级索引。 下面看一下它们的含义&#xff1a; 1.1、聚集索引选取规则 如果存在主键&#xff0c;主键索引就是聚集索引。如果不存在主键&#xff0c;将使…

【Lua】第二篇:打印函数和注释

文章目录 一. 打印函数二. 注释方式1. 单行注释2. 多行注释 一. 打印函数 Lua 程序是以 .lua 结尾的文件&#xff0c;创建一个的 Test.lua 的文件&#xff0c;使用 print 函数输出字符串"Hello World"&#xff1a; print(Hello World) 保存之后使用命令lua 文件名编…

MyBatis(14)MyBatis 如何实现多对一和一对多的映射关系

MyBatis 中实现多对一和一对多的映射主要依赖于映射文件中的 <association> 和 <collection> 标签。这两种映射关系的实现&#xff0c;是通过嵌套查询或嵌套结果映射来完成的。在源码层面&#xff0c;MyBatis 使用相应的处理器来处理这些标签&#xff0c;最终实现复…