【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.pswp.cn/web/36885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/36885.shtml
英文地址,請注明出處:http://en.pswp.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;最終實現復…