news 2026/4/16 11:05:57

【从零开始的Qt开发指南】(十一)Qt常用控件之多元素控件与容器类控件深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【从零开始的Qt开发指南】(十一)Qt常用控件之多元素控件与容器类控件深度解析


目录

前言

一、多元素与容器类控件的核心价值

二、多元素控件:批量数据的高效展示与交互

2.1 ListWidget:简洁高效的列表控件

2.1.1 核心属性与 API

2.1.2 基础用法:简单列表的增删改查

2.1.3 进阶用法:带图标的列表与多选功能

2.1.4 ListWidget 避坑指南

2.2 TableWidget:功能强大的表格控件

2.2.1 核心属性与 API

2.2.2 基础用法:增删改查

2.2.3 TableWidget 避坑指南

2.3 TreeWidget:层级分明的树形控件

2.3.1 核心属性与 API

2.3.1 基础树形结构

2.3.2 TreeWidget 避坑指南

三、容器类控件:界面的有序组织与分组

3.1 GroupBox:控件分组的 “收纳盒”

3.1.1 核心属性与 API

3.1.2 基础用法:表单分组

3.1.3 进阶用法:扁平模式与对齐方式

3.1.4 GroupBox 避坑指南

3.2 TabWidget:多页面切换的 “导航栏”

3.2.1 核心属性与 API

3.2.2 基础用法:功能模块切换

3.2.3 进阶用法:标签页的增加与删除

3.2.4 TabWidget 避坑指南

总结


前言

在 Qt GUI 开发中,当需要展示批量数据或对控件进行分组管理时,单纯的基础控件已无法满足需求。多元素控件(ListWidget/TableWidget/TreeWidget)专为批量数据展示而生,支持列表、表格、树形等多样化数据呈现;容器类控件(GroupBox/TabWidget)则擅长控件分组与界面分区,让复杂界面更具逻辑性和可读性。本文基于 Qt 5.14 版本,以 “属性解析 + 实战案例 + 进阶技巧” 的结构,全面拆解这两类控件的核心用法,带你轻松搞定复杂界面开发!下面就让我们正式开始吧!


一、多元素与容器类控件的核心价值

在实际项目中,我们常面临这些场景:展示一组文件列表、呈现多行多列的表格数据、构建层级化的分类目录、将相关控件归类展示、用标签页切换不同功能模块 —— 这正是多元素与容器类控件的用武之地。

  • 多元素控件:聚焦 “数据展示与交互”,支持批量数据的添加、删除、选中、排序等操作,是处理集合数据的核心工具;
  • 容器类控件:聚焦 “界面组织与分组”,通过分组、分页等方式优化界面布局,提升用户体验和界面整洁度。

本文将详细讲解 5 个核心控件:

  1. 多元素控件:ListWidget(列表)、TableWidget(表格)、TreeWidget(树形)
  2. 容器类控件:GroupBox(分组框)、TabWidget(标签页)

二、多元素控件:批量数据的高效展示与交互

多元素控件的核心优势是“批量管理数据”,Qt 提供了基于 Item 的简化版控件(ListWidget/TableWidget/TreeWidget),无需手动创建 Model,直接操作 Item 即可实现数据展示,开发效率极高。

2.1 ListWidget:简洁高效的列表控件

QListWidget 是垂直列表控件,适用于展示单列批量数据(如文件列表、选项列表等),支持单选、多选、添加、删除等基础操作,用法简洁直观。

2.1.1 核心属性与 API

属性 / 方法功能说明实用场景
currentRow()获取当前选中行的下标(未选中返回 - 1)选中数据后获取位置
currentItem()获取当前选中的 Item 对象获取选中数据的详细信息
addItem(const QString& text)添加单个列表项动态添加数据
addItems(const QStringList& items)批量添加列表项初始化批量数据
insertItem(int row, const QString& text)在指定行插入列表项插入中间数据
takeItem(int row)删除指定行并返回该 Item(需手动释放)删除数据并回收资源
setSortingEnabled(bool enable)启用 / 禁用排序数据排序展示
itemClicked(QListWidgetItem* item)点击列表项时触发的信号点击事件响应

核心数据载体:QListWidgetItem,每个 Item 可设置文本、图标、字体、选中状态等,是列表数据的最小单元。

2.1.2 基础用法:简单列表的增删改查

#include "widget.h" #include <QListWidget> #include <QLineEdit> #include <QPushButton> #include <QVBoxLayout> #include <QHBoxLayout> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); this->setWindowTitle("ListWidget基础用法:编程语言列表"); // 布局管理:输入框+按钮(水平布局)+列表(垂直布局) QVBoxLayout *mainLayout = new QVBoxLayout(this); QHBoxLayout *inputLayout = new QHBoxLayout(); // 输入框:用于添加新列表项 QLineEdit *inputEdit = new QLineEdit(this); inputEdit->setPlaceholderText("请输入编程语言名称"); // 按钮:添加、删除 QPushButton *addBtn = new QPushButton("添加", this); QPushButton *delBtn = new QPushButton("删除选中", this); // 列表控件 QListWidget *langList = new QListWidget(this); // 初始化列表数据 QStringList initLangs = {"C++", "Java", "Python", "Qt", "JavaScript", "Golang"}; langList->addItems(initLangs); // 启用排序 langList->setSortingEnabled(true); // 设置选中模式:单选(默认) langList->setSelectionMode(QAbstractItemView::SingleSelection); // 组装布局 inputLayout->addWidget(inputEdit); inputLayout->addWidget(addBtn); inputLayout->addWidget(delBtn); mainLayout->addLayout(inputLayout); mainLayout->addWidget(langList); // 添加按钮点击事件 connect(addBtn, &QPushButton::clicked, this, [=]() { QString text = inputEdit->text().trimmed(); if (!text.isEmpty()) { // 添加新项并自动排序 new QListWidgetItem(text, langList); inputEdit->clear(); } }); // 删除按钮点击事件 connect(delBtn, &QPushButton::clicked, this, [=]() { // 获取当前选中行 int currentRow = langList->currentRow(); if (currentRow != -1) { // 删除选中项(takeItem返回Item,需手动删除避免内存泄漏) QListWidgetItem *item = langList->takeItem(currentRow); delete item; } }); // 列表项点击事件 connect(langList, &QListWidget::itemClicked, this, [=](QListWidgetItem *item) { qDebug() << "选中语言:" << item->text(); }); }

2.1.3 进阶用法:带图标的列表与多选功能

ListWidget 支持为 Item 添加图标,且支持多选模式,适用于文件列表、应用列表等场景:

先在.ui文件中创建控件:

编写代码:

#include "widget.h" #include "ui_widget.h" #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //往这里添加一些元素 ui->listWidget->addItem("C++"); ui->listWidget->addItem("Java"); ui->listWidget->addItem("Python"); //在QListWidgetItem中,可以设置字体属性,设置图标,设置文字大小,设置是否被选中等状态 // ui->listWidget->addItem(new QListWidgetItem("C++")); // ui->listWidget->addItem(new QListWidgetItem("Java")); // ui->listWidget->addItem(new QListWidgetItem("Python")); //也可以在.ui文件中通过图形化界面编辑 } Widget::~Widget() { delete ui; } void Widget::on_pushButton_insert_clicked() { //1.先获取到输入框中的内容 const QString& text =ui->lineEdit->text(); //2.添加到QListWidget中 ui->listWidget->addItem(text); //添加到末尾,如果想添加到中间位置,需要使用insertItem } void Widget::on_pushButton_delete_clicked() { //1.先获取到被选中的元素 int row = ui->listWidget->currentRow(); if(row < 0) { return; } //2.按照行号来删除元素 ui->listWidget->takeItem(row); } void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { //通过这个槽函数来感知到变化 if(current != nullptr) { qDebug() << "当前选中的元素:" << current->text(); } if(previous != nullptr) { qDebug() << "上次选中的元素:" << previous->text(); } }

运行结果如下:

2.1.4 ListWidget 避坑指南

  1. 内存泄漏takeItem方法会从列表中移除 Item 但不删除,需手动delete回收资源;
  2. 排序不生效:需先调用setSortingEnabled(true),新增 Item 才会自动排序;
  3. 多选获取:通过selectedItems()获取所有选中项,返回QList<QListWidgetItem*>
  4. Item 编辑:需设置item->setFlags(item->flags() | Qt::ItemIsEditable),默认不可编辑。

2.2 TableWidget:功能强大的表格控件

QTableWidget 是多行多列的表格控件,适用于展示结构化数据(如学生信息表、商品列表、数据统计等),支持单元格编辑、表头自定义、行高列宽调整等功能,是 Qt 中最常用的多元素控件之一。

2.2.1 核心属性与 API

属性 / 方法功能说明实用场景
setColumnCount(int count)设置列数初始化表格结构
setRowCount(int count)设置行数初始化表格结构
setHorizontalHeaderItem(int col, QTableWidgetItem* item)设置列标题自定义表头文本 / 样式
setItem(int row, int col, QTableWidgetItem* item)设置单元格内容填充表格数据
currentRow()/currentColumn()获取当前选中单元格的行 / 列下标定位选中位置
insertRow(int row)/insertColumn(int col)插入行 / 列动态添加数据
removeRow(int row)/removeColumn(int col)删除行 / 列动态删除数据
setEditTriggers(QAbstractItemView::EditTriggers triggers)设置编辑触发方式控制单元格是否可编辑
horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeMode mode)设置列宽调整模式自适应列宽 / 固定列宽

核心数据载体:QTableWidgetItem,每个单元格对应一个 Item,支持设置文本、图标、对齐方式、字体等。

2.2.2 基础用法:增删改查

在.ui文件中创建控件:

编写代码:

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //创建三行 ui->tableWidget->insertRow(0); ui->tableWidget->insertRow(1); ui->tableWidget->insertRow(2); //创建三列 ui->tableWidget->insertColumn(0); ui->tableWidget->insertColumn(1); ui->tableWidget->insertColumn(2); //给三列设置列名(设置水平方向的表头) ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("学号")); ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("姓名")); ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("年龄")); //给表格中添加数据 ui->tableWidget->setItem(0, 0, new QTableWidgetItem("1001")); ui->tableWidget->setItem(0, 1, new QTableWidgetItem("张三")); ui->tableWidget->setItem(0, 2, new QTableWidgetItem("20")); ui->tableWidget->setItem(1, 0, new QTableWidgetItem("1002")); ui->tableWidget->setItem(1, 1, new QTableWidgetItem("李四")); ui->tableWidget->setItem(1, 2, new QTableWidgetItem("19")); ui->tableWidget->setItem(2, 0, new QTableWidgetItem("1003")); ui->tableWidget->setItem(2, 1, new QTableWidgetItem("王五")); ui->tableWidget->setItem(2, 2, new QTableWidgetItem("18")); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_insertRow_clicked() { //需要知道当前一共有多少行 int rowCount = ui->tableWidget->rowCount(); //在最后一行之后新增新行 //注意此处的参数是“下标”,表示你新增之后的一行是第几行 ui->tableWidget->insertRow(rowCount); } void Widget::on_pushButton_deleteRow_clicked() { //获取到选中的行号 int curRow = ui->tableWidget->currentRow(); //删除这一行 ui->tableWidget->removeRow(curRow); } void Widget::on_pushButton_insertColumn_clicked() { //需要知道当前一共有多少列 int colCount = ui->tableWidget->columnCount(); //在对应位置新增新列 ui->tableWidget->insertColumn(colCount); //设置列名(从输入框中获取到) const QString& text = ui->lineEdit->text(); ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(text)); } void Widget::on_pushButton_4_clicked() { //获取到选中的列号 int curCol = ui->tableWidget->currentColumn(); //删除这一列 ui->tableWidget->removeColumn(curCol); }

运行结果:

2.2.3 TableWidget 避坑指南

  1. 表头设置setHorizontalHeaderLabels需在setColumnCount之后调用,否则表头不生效;
  2. 单元格居中:默认单元格文本左对齐,需手动设置item->setTextAlignment(Qt::AlignCenter)
  3. 行高列宽QHeaderView::Stretch表示自适应拉伸,QHeaderView::Fixed表示固定尺寸;
  4. 编辑控制setEditTriggers(QAbstractItemView::NoEditTriggers)可禁用单元格编辑,避免误操作;
  5. 数据获取:通过item(row, col)获取单元格数据,需判断 Item 是否为nullptr(避免空指针崩溃)。

2.3 TreeWidget:层级分明的树形控件

QTreeWidget 是树形结构控件,适用于展示层级化数据(如文件目录、分类菜单、组织架构等),支持父节点、子节点的嵌套展示,支持展开 / 折叠操作。

2.3.1 核心属性与 API

属性 / 方法功能说明实用场景
setHeaderLabel(const QString& text)设置表头文本(单列)单列树形结构
setColumnCount(int count)设置列数(多列树形)多列树形结构(如文件名称 + 大小)
addTopLevelItem(QTreeWidgetItem* item)添加顶层节点初始化根节点
QTreeWidgetItem* topLevelItem(int index)获取指定顶层节点操作顶层节点
topLevelItemCount()获取顶层节点个数遍历顶层节点
item->addChild(QTreeWidgetItem* child)为节点添加子节点构建层级结构
item->setExpanded(bool expanded)设置节点是否展开默认展开 / 折叠节点
currentItem()获取当前选中的节点操作选中节点
itemExpanded(QTreeWidgetItem* item)节点展开时触发的信号展开节点时加载子数据

核心数据载体:QTreeWidgetItem,每个节点对应一个 Item,支持多列数据,可通过setText(col, text)设置每列内容。

2.3.1 基础树形结构

先创建控件:

编写代码:

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //设置根节点的名字 ui->treeWidget->setHeaderLabel("动物"); //新增顶层结点 QTreeWidgetItem* item1 = new QTreeWidgetItem(); //每个结点都可以设置多个列,此处为了简单就只设置一列 item1->setText(0, "猫"); //添加到顶层结点中 ui->treeWidget->addTopLevelItem(item1); //新增顶层结点 QTreeWidgetItem* item2 = new QTreeWidgetItem(); //每个结点都可以设置多个列,此处为了简单就只设置一列 item2->setText(0, "狗"); //添加到顶层结点中 ui->treeWidget->addTopLevelItem(item2); //新增顶层结点 QTreeWidgetItem* item3 = new QTreeWidgetItem(); //每个结点都可以设置多个列,此处为了简单就只设置一列 item3->setText(0, "鸟"); //添加到顶层结点中 ui->treeWidget->addTopLevelItem(item3); //新增一些子结点 QTreeWidgetItem* item4 = new QTreeWidgetItem(); item4->setText(0, "中华田园猫"); item1->addChild(item4); QTreeWidgetItem* item5 = new QTreeWidgetItem(); item5->setText(0, "布偶猫"); item1->addChild(item5); QTreeWidgetItem* item6 = new QTreeWidgetItem(); item6->setText(0, "暹罗猫"); item1->addChild(item6); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_insertTopLevelItem_clicked() { //获取到输入框中的内容 const QString& text = ui->lineEdit->text(); //构造一个QTreeWidgetItem QTreeWidgetItem* item = new QTreeWidgetItem(); item->setText(0, text); //添加到顶层结点中 ui->treeWidget->addTopLevelItem(item); } void Widget::on_pushButton_insertItem_clicked() { //获取到当前选中的结点 QTreeWidgetItem* currentItem = ui->treeWidget->currentItem(); if(currentItem == nullptr) { return; } //获取到输入框中的内容 const QString& text = ui->lineEdit->text(); //构造一个QTreeWidgetItem QTreeWidgetItem* item = new QTreeWidgetItem(); item->setText(0, text); //插入到选中结点的子结点中 currentItem->addChild(item); } void Widget::on_pushButton_deleteItem_clicked() { //获取到当前选中的结点 QTreeWidgetItem* currentItem = ui->treeWidget->currentItem(); if(currentItem == nullptr) { return; } //删除选中的元素,需要先获取到父元素,通过父元素进行删除 QTreeWidgetItem* parent = currentItem->parent(); if(parent == nullptr) { //顶层元素 int index = ui->treeWidget->indexOfTopLevelItem(currentItem); ui->treeWidget->takeTopLevelItem(index); } else { //普通元素 parent->removeChild(currentItem); } }

运行结果:

2.3.2 TreeWidget 避坑指南

  1. 节点层级:顶层节点通过addTopLevelItem添加,子节点通过parentItem->addChild添加;
  2. 路径获取:通过递归遍历parent()可获取节点的完整路径;
  3. 节点删除:子节点需通过父节点removeChild删除,顶层节点需通过树形控件takeTopLevelItem删除;
  4. 多列设置setColumnCount需在设置表头前调用,setText(col, text)设置对应列内容;
  5. 图标设置setIcon(col, icon)设置对应列的图标,默认列索引为 0。

三、容器类控件:界面的有序组织与分组

容器类控件本身不直接展示数据,而是作为 “容器” 管理其他控件,通过分组、分页等方式优化界面结构,让复杂界面更易理解和操作。

3.1 GroupBox:控件分组的 “收纳盒”

QGroupBox 是带标题的分组框,适用于将相关控件归类展示(如表单中的同一模块、选项组等),支持边框显示、标题自定义,还可设置为可勾选模式(勾选后才启用组内控件)。

3.1.1 核心属性与 API

属性 / 方法功能说明实用场景
setTitle(const QString& title)设置分组框标题标识分组用途
setFlat(bool flat)设置是否为扁平模式(无边框)简洁界面风格
setCheckable(bool checkable)设置是否可勾选控制组内控件启用 / 禁用
setChecked(bool checked)设置勾选状态默认启用 / 禁用组内控件
setAlignment(Qt::Alignment alignment)设置组内控件对齐方式优化组内布局

3.1.2 基础用法:表单分组

先创建控件:

运行结果如下:

3.1.3 进阶用法:扁平模式与对齐方式

#include "widget.h" #include <QGroupBox> #include <QPushButton> #include <QHBoxLayout> #include <QVBoxLayout> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); this->setWindowTitle("GroupBox进阶:扁平模式与对齐"); QVBoxLayout *mainLayout = new QVBoxLayout(this); // 扁平模式分组框(无边框) QGroupBox *flatGroup = new QGroupBox("操作按钮", this); flatGroup->setFlat(true); // 扁平模式 QHBoxLayout *flatLayout = new QHBoxLayout(flatGroup); flatLayout->addWidget(new QPushButton("新建", this)); flatLayout->addWidget(new QPushButton("打开", this)); flatLayout->addWidget(new QPushButton("保存", this)); flatLayout->addWidget(new QPushButton("删除", this)); // 右对齐分组框 QGroupBox *alignGroup = new QGroupBox("选项设置", this); alignGroup->setAlignment(Qt::AlignRight); // 组内控件右对齐 QVBoxLayout *alignLayout = new QVBoxLayout(alignGroup); alignLayout->addWidget(new QCheckBox("启用自动保存", this)); alignLayout->addWidget(new QCheckBox("显示状态栏", this)); alignLayout->addWidget(new QCheckBox("允许拖拽", this)); mainLayout->addWidget(flatGroup); mainLayout->addWidget(alignGroup); }

3.1.4 GroupBox 避坑指南

  1. 组内布局:GroupBox 必须设置布局管理器(如 QVBoxLayout),否则内部控件无法正常显示;
  2. 勾选功能setCheckable(true)后,组内控件默认随勾选状态启用 / 禁用,无需手动控制;
  3. 扁平模式setFlat(true)会隐藏边框,仅显示标题,适用于简洁界面;
  4. 对齐方式setAlignment控制组内控件的整体对齐,而非标题对齐。

3.2 TabWidget:多页面切换的 “导航栏”

QTabWidget 是标签页控件,适用于将不同功能模块放在不同标签页中(如设置界面、编辑界面等),通过切换标签页实现功能切换,节省界面空间,提升界面整洁度。

3.2.1 核心属性与 API

属性 / 方法功能说明实用场景
addTab(QWidget* page, const QString& label)添加标签页(页面 + 标题)新增功能模块
insertTab(int index, QWidget* page, const QString& label)在指定位置插入标签页调整标签页顺序
removeTab(int index)删除指定标签页动态移除模块
currentIndex()获取当前选中标签页的下标判断当前激活模块
setCurrentIndex(int index)设置当前选中标签页手动切换模块
setTabText(int index, const QString& text)修改标签页标题动态更新标题
setTabIcon(int index, const QIcon& icon)设置标签页图标美化标签页
setTabsCloseable(bool closeable)设置标签页是否可关闭支持动态关闭标签页
currentChanged(int index)标签页切换时触发的信号切换模块时执行初始化

3.2.2 基础用法:功能模块切换

先创建控件:

运行结果如下:

3.2.3 进阶用法:标签页的增加与删除

编辑.ui文件:

编写代码:

#include "widget.h" #include "ui_widget.h" #include <QLabel> #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //先在每个标签页中,添加一个Label QLabel* label1 = new QLabel(ui->tab); label1->setText("标签页1"); label1->resize(100, 50); QLabel* label2 = new QLabel(ui->tab_2); label2->setText("标签页2"); label2->resize(100, 50); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_clicked() { //使用addTab方法创建新的标签页 //参数1 要指定一个QWidget //参数2 指定这个标签页的text(标题),此处标题就叫做Tab + 数字 int count = ui->tabWidget->count(); //获取到标签页的数量 QWidget* w = new QWidget(); ui->tabWidget->addTab(w, QString("Tab ") + QString::number(count + 1)); //添加一个QLabel显示内容 QLabel* label = new QLabel(w); label->setText(QString("标签页") +QString::number(count + 1)); label->resize(100, 50); //设置新标签页被选中 ui->tabWidget->setCurrentIndex(count); } void Widget::on_pushButton_2_clicked() { //获取到当前选中的标签页的下标 int index = ui->tabWidget->currentIndex(); //删除标签页 ui->tabWidget->removeTab(index); } void Widget::on_tabWidget_currentChanged(int index) { qDebug() << "当前选中的标签页是:" << index; }

运行结果如下:

3.2.4 TabWidget 避坑指南

  1. 页面创建:每个标签页必须是独立的 QWidget,且需设置布局管理器,否则控件无法正常排列;
  2. 关闭标签页setTabsCloseable(true)后,通过tabCloseRequested信号处理关闭逻辑,需手动调用removeTab
  3. 动态标题:通过setTabText可动态更新标签页标题,适用于显示实时状态;
  4. 嵌套布局:标签页内部可嵌套任意布局,支持复杂界面设计;
  5. 切换初始化currentChanged信号在标签页切换时触发,可用于初始化当前页面数据。

总结

多元素与容器类控件是 Qt 界面开发的核心工具,掌握它们的使用后,可轻松应对复杂数据展示和界面布局需求。如果本文对你有帮助,欢迎点赞、收藏、转发,如有疑问或建议,欢迎在评论区留言交流~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 10:45:49

Java 简介

Java 简介 引言 Java 是一种广泛使用的计算机编程语言,自从1995年由 Sun Microsystems 公司(现为 Oracle Corporation 的子公司)推出以来,它已经成为全球软件开发者最喜爱的语言之一。Java 的设计哲学强调“一次编写,到处运行”,这意味着Java程序可以在任何支持Java虚拟…

作者头像 李华
网站建设 2026/3/23 11:11:32

彻底搞懂YOLOv1:R-CNN与YOLO架构的区别在哪里?

0 前言在计算机视觉领域中&#xff0c;基础的任务除了目标分类之外&#xff0c;往前进一步就是目标检测了。在之前的文章中&#xff0c;我介绍过AlexNet、ResNet&#xff0c;其实这些模型一开始都是为了目标分类诞生的。目标分类和检测的区别在哪里呢&#xff1f;假设我们有一张…

作者头像 李华
网站建设 2026/4/15 11:15:36

JavaScript Window Location

JavaScript Window Location 概述 window.location 是 JavaScript 中一个非常重要的对象,它允许开发者获取和修改浏览器窗口的位置信息。通过这个对象,我们可以实现页面跳转、获取当前URL以及解析URL中的参数等功能。本文将详细介绍 window.location 的使用方法、属性和常见…

作者头像 李华
网站建设 2026/4/13 19:15:51

通信系统仿真:通信系统基础理论_(3).调制与解调技术

调制与解调技术 1. 调制的基本概念 1.1 什么是调制 调制是通信系统中的一个基本概念,它是指将基带信号(通常是指低频信号)变换成适合在信道中传输的高频信号的过程。基带信号可以直接传输,但通常由于信道的频率特性、带宽限制或干扰等问题,需要通过调制将信号转换成适合…

作者头像 李华
网站建设 2026/4/14 18:41:33

通信系统仿真:通信系统基础理论_(12).卫星通信技术

卫星通信技术 1. 卫星通信概述 1.1 卫星通信的基本概念 卫星通信是利用人造地球卫星作为中继站,转发或反射无线电信号,以实现两个或多个地球站之间的通信。卫星通信系统通常由卫星、地球站、跟踪、遥测和控制(TT&C)系统、以及地面网络组成。卫星通信具有覆盖范围广、…

作者头像 李华