C++ Qt 开发:ListWidget列表框组件

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ListWidget列表框组件的常用方法及灵活运用。

QListWidget 是 Qt 中的一个列表框组件,用于显示一列项目,并允许用户进行选择。每个项目可以包含一个图标和文本,可以使用 QListWidgetItem 类来表示。ListWidget组件与TreeWidget有些相似,区别在于TreeWidget可以实现嵌套以及多字段结构,而ListWidget则只能实现单字段结构,该组件常用于显示单条记录,例如只显示IP地址,用户名等数据。

以下是 QListWidget 类的一些常用方法,说明和概述:

方法描述
addItem(QListWidgetItem *item)向列表中添加一个项目。
addItems(const QStringList &labels)向列表中添加多个项目。
count()返回列表中的项目数量。
currentItem()返回当前选择的项目。
item(int row)返回给定行索引的项目。
itemAt(const QPoint &p)返回给定坐标处的项目。
takeItem(int row)从列表中删除并返回给定行索引的项目。
clear()删除列表中的所有项目。
clearSelection()取消选择所有项目。
removeItemWidget(QListWidgetItem *item)从列表中删除一个项目并释放与之关联的任何小部件。
scrollToItem(QListWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible)滚动列表以确保给定项目可见。
sortItems(Qt::SortOrder order = Qt::AscendingOrder)对列表中的项目进行排序。
itemClicked(QListWidgetItem *item)项目被点击时发出的信号。
itemDoubleClicked(QListWidgetItem *item)项目被双击时发出的信号。
setItemWidget(QListWidgetItem *item, QWidget *widget)在给定项目的位置设置小部件。
setIconSize(const QSize &size)设置项目图标的大小。
setCurrentRow(int row)设置当前选择的行。
setCurrentItem(QListWidgetItem *item)设置当前选择的项目。
selectedItems()返回当前选择的所有项目。
selectedIndexes()返回当前选择的所有项目的模型索引。
setSelectionMode(QAbstractItemView::SelectionMode mode)设置选择模式,例如 SingleSelectionMultiSelection

这只是 QListWidget 类的一部分方法。你可以查阅官方文档以获取完整的方法列表,以及这些方法的详细说明。

首先读者可自行绘制好如下所示的UI界面,在界面中左侧包含一个ListWidget列表框,右侧包含各类用于控制组件的pushButton按钮,如下图所示;

1.1 初始化节点

如下代码是一个槽函数 on_pushButton_init_clicked,主要作用是初始化一个 QListWidget 列表框,其中包含了一系列的 QListWidgetItem 项。

以下是概述:

  1. 清空列表框: 首先,通过 ui->listWidget->clear() 清空了列表框,以确保在初始化之前移除已有的项。
  2. 循环初始化项: 使用 for 循环,遍历了 0 到 9 的数字,共初始化了 10 个项。
  3. 创建 QListWidgetItem 对于每个循环,通过 new QListWidgetItem() 创建了一个新的 QListWidgetItem 对象 aItem
  4. 设置文本标签: 使用 setText 方法为 QListWidgetItem 设置了文本标签,内容是形如 “192.168.1.x” 的字符串。
  5. 设置图标: 使用 setIcon 方法为每个项设置了相同的图标,这里使用了名为 “1.ico” 的图标。
  6. 设置为选中状态: 使用 setCheckState 方法将每个项设为选中状态,即显示复选框并勾选。
  7. 设置不可编辑状态: 使用 setFlags 方法将每个项设置为不可编辑状态,只允许选择和检查操作。
  8. 增加项到列表中: 使用 ui->listWidget->addItem(aItem) 将每个项添加到 QListWidget 中。

该槽函数用于初始化一个包含特定图标、文本、复选框等属性的 QListWidget,方便用户进行选择和操作。

// 初始化列表
void MainWindow::on_pushButton_init_clicked()
{
    // 每一行是一个QListWidgetItem
    QListWidgetItem *aItem;

    // 设置ICON的图标
    QIcon aIcon;
    aIcon.addFile(":/image/1.ico");

    // 清空列表框
    ui->listWidget->clear();

    // 循环初始化
    for(int x=0;x<10;x++)
    {
        // 填充字符串
        QString str = QString::asprintf("192.168.1.%d",x);

        // 新建一个项
        aItem = new QListWidgetItem();

        aItem->setText(str);                        // 设置文字标签
        aItem->setIcon(aIcon);                      // 设置图标
        aItem->setCheckState(Qt::Checked);          // 设为选中状态
        aItem->setFlags(Qt::ItemIsSelectable |      // 设置为不可编辑状态
                         Qt::ItemIsUserCheckable
                        |Qt::ItemIsEnabled);

        // 增加项到列表中
        ui->listWidget->addItem(aItem);
    }
}

运行效果如下图;

1.2 设置编辑状态

如下槽函数 on_pushButton_edit_clicked 的主要功能是将所有项设置为可编辑状态。

以下是概述:

  1. 获取所有项数量: 使用 ui->listWidget->count() 获取列表框中的项的数量。
  2. 循环设置状态: 使用 for 循环遍历每个项,获取当前项的句柄。
  3. 设置为可编辑状态: 使用 setFlags 方法将每个项的状态设置为可编辑,包括可选择、可编辑、可检查、可启用等状态。

该槽函数的作用是将列表框中的所有项的状态设置为可编辑,这样用户可以在运行时修改这些项的文本内容。

// 设置所有项设置为可编辑状态
void MainWindow::on_pushButton_edit_clicked()
{
    int x,cnt;
    QListWidgetItem *aItem;

    // 获取所有项数量
    cnt = ui->listWidget->count();
    for(x=0;x<cnt;x++)
    {
        // 得到当前选中项句柄
        aItem = ui->listWidget->item(x);

        // 设置状态
        aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable
                        |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
    }
}

运行效果如下图;

1.3 全选与反选

如下槽函数 on_pushButton_selectall_clicked 的核心功能是实现一个全选按钮,即将列表框中的所有项设置为选中状态。

以下是概述:

  1. 获取总数: 使用 ui->listWidget->count() 获取列表框中的项的总数。
  2. 循环设置选中状态: 使用 for 循环遍历每个项,获取每个项的指针。
  3. 设置为选中状态: 使用 setCheckState 方法将每个项的状态设置为选中状态,即勾选复选框。

该槽函数的作用是实现一个全选按钮,方便用户一次性选中所有列表框中的项。

void MainWindow::on_pushButton_selectall_clicked()
{
    // 获取总数
    int cnt = ui->listWidget->count();
    for(int x=0;x<cnt;x++)
    {
        // 获取到项的指针
        QListWidgetItem *aItem = ui->listWidget->item(x);

        // 设置为选中
        aItem->setCheckState(Qt::Checked);
    }

}

如下槽函数 on_pushButton_noselect_clicked 的核心功能是实现一个全不选按钮,即将列表框中的所有项设置为非选中状态。

以下是概述:

  1. 获取总数: 使用 ui->listWidget->count() 获取列表框中的项的总数。
  2. 循环设置非选中状态: 使用 for 循环遍历每个项,获取每个项的指针。
  3. 设置为非选中状态: 使用 setCheckState 方法将每个项的状态设置为非选中状态,即取消勾选复选框。

该槽函数的作用是实现一个全不选按钮,方便用户一次性取消选中列表框中的所有项。

void MainWindow::on_pushButton_noselect_clicked()
{
    // 获取总数
    int cnt = ui->listWidget->count();
    for(int x=0;x<cnt;x++)
    {
        // 获取到一项指针
        QListWidgetItem *aItem = ui->listWidget->item(x);

        // 设置为非选中
        aItem->setCheckState(Qt::Unchecked);
    }
}

如下槽函数 on_pushButton_deselect_clicked 的核心功能是实现一个反选按钮,即将列表框中的每个项的选中状态进行反转。

以下是概述:

  1. 获取总数: 使用 ui->listWidget->count() 获取列表框中的项的总数。
  2. 循环设置反选状态: 使用 for 循环遍历每个项,获取每个项的指针。
  3. 反选状态: 使用 checkState 方法获取每个项的当前选中状态,如果是选中状态 (Qt::Checked),则设置为非选中状态 (Qt::Unchecked),反之亦然。

该槽函数的作用是实现一个反选按钮,方便用户一次性反转列表框中的所有项的选中状态。

void MainWindow::on_pushButton_deselect_clicked()
{
    int x,cnt;
    QListWidgetItem *aItem;

    // 获取总数
    cnt = ui->listWidget->count();
    for(x=0;x<cnt;x++)
    {
        // 获取到一项指针
        aItem = ui->listWidget->item(x);

        // 如果未选中则选中否则不选
        if(aItem->checkState() != Qt::Checked)
            aItem->setCheckState(Qt::Checked);
        else
            aItem->setCheckState(Qt::Unchecked);
    }
}

运行效果如下图;

1.4 插入与追加

如下槽函数 on_pushButton_add_clicked 的核心功能是实现一个“增加一项”按钮,即在列表框的尾部追加一个新的项。

以下是概述:

  1. 创建图标: 使用 QIcon 创建一个新的图标,这里使用了名为 “2.ico” 的图标。
  2. 创建新的 QListWidgetItem 使用 new QListWidgetItem("新增的项目") 创建一个新的 QListWidgetItem 对象,设置了文本为 “新增的项目”。
  3. 设置图标和状态: 使用 setIcon 设置项的图标,setCheckState 设置项的选中状态为选中,setFlags 设置项的状态为可选择、可检查、可启用。
  4. 追加到控件: 使用 ui->listWidget->addItem(aItem) 将新创建的项追加到列表框的尾部。

该槽函数的作用是在列表框的尾部追加一个新的项,该项包含指定的文本、图标以及初始的选中状态。

void MainWindow::on_pushButton_add_clicked()
{
    QIcon aIcon;
    aIcon.addFile(":/image/2.ico");

    QListWidgetItem *aItem = new QListWidgetItem("新增的项目");    // 增加项目名
    aItem->setIcon(aIcon);                                       // 设置图标
    aItem->setCheckState(Qt::Checked);                           // 设置为选中
    aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
    ui->listWidget->addItem(aItem);                              // 增加到控件
}

如下槽函数 on_pushButton_ins_clicked 的核心功能是实现一个“指定位置插入一项”按钮,即在列表框的指定位置插入一个新的项。

以下是概述:

  1. 创建图标: 使用 QIcon 创建一个新的图标,这里使用了名为 “3.ico” 的图标。
  2. 创建新的 QListWidgetItem 使用 new QListWidgetItem("插入的数据") 创建一个新的 QListWidgetItem 对象,设置了文本为 “插入的数据”。
  3. 设置图标和状态: 使用 setIcon 设置项的图标,setCheckState 设置项的选中状态为选中,setFlags 设置项的状态为可选择、可检查、可启用。
  4. 在指定位置插入项: 使用 ui->listWidget->insertItem(ui->listWidget->currentRow(), aItem) 在当前行的上方插入一个新项。

该槽函数的作用是在列表框的指定位置插入一个新的项,该项包含指定的文本、图标以及初始的选中状态。

void MainWindow::on_pushButton_ins_clicked()
{
    QIcon aIcon;
    aIcon.addFile(":/image/3.ico");

    QListWidgetItem *aItem = new QListWidgetItem("插入的数据");
    aItem->setIcon(aIcon);
    aItem->setCheckState(Qt::Checked);
    aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);

    // 在当前行的上方插入一个项
    ui->listWidget->insertItem(ui->listWidget->currentRow(),aItem);
}

运行效果如下图;

1.5 删除列表一行

如下槽函数 on_pushButton_delete_clicked 的核心功能是实现一个“删除选中项”按钮,即删除列表框中当前选中的项。

以下是概述:

  1. 获取当前行: 使用 ui->listWidget->currentRow() 获取当前选中项的行索引。
  2. 移除指定行的项: 使用 ui->listWidget->takeItem(row) 移除指定行的项,该方法返回被移除的项的指针,但不释放空间。
  3. 释放空间: 使用 delete aItem 释放被移除项的空间,确保不发生内存泄漏。

该槽函数的作用是删除列表框中当前选中的项,同时释放相应的内存空间。

void MainWindow::on_pushButton_delete_clicked()
{
    // 获取当前行
    int row = ui->listWidget->currentRow();

    // 移除指定行的项,但不delete
    QListWidgetItem *aItem = ui->listWidget->takeItem(row);

    // 释放空间
    delete aItem;
}

运行效果如下图;

1.6 绑定右键菜单

在之前的内容中我们展示了如何给MainWindow主窗体增加右键菜单,本节我们将给ListWidget增加右键菜单,当用户在ListWidget组件中的任意一个子项下右键,则让其弹出这个菜单,并根据选择提供不同的功能。

首先我们绘制两个UI界面,并通过Tab组件将其分离开,为了方便演示我们需要手动增加列表项内容,增加方法是在ListWidget上面右键并选中编辑项目按钮,此时就可以逐行向列表中录入数据集。

为了增加菜单,我们首先需要在程序全局增加QAction其中每一个QAction则代表一个菜单选项指针,由于我们计划增加三个菜单选项,则此处就保留三个全局菜单指针。

#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <iostream>

// 全局下设置增加删除菜单
QAction *NewAction;
QAction *InsertAction;
QAction *DeleteAction;

首先以右键菜单演示为例,在MainWindow主函数中,首先通过创建顶部菜单并将其设置为隐藏属性,接着通过Connect将每一个子菜单与Action进行连接,代码如下所示;

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // ----------------------------------------------------
    // 绘制部分
    // ----------------------------------------------------

    // 使用 customContextMenuRequested 信号则需要设置
    ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    // 隐藏菜单栏上的右击菜单
    this->setContextMenuPolicy(Qt::NoContextMenu);

    // 创建基础顶部菜单
    QMenuBar *bar = menuBar();
    this->setMenuBar(bar);
    QMenu * fileMenu = bar->addMenu("菜单1");

    // 隐藏顶部菜单栏
    bar->setVisible(false);

    // 添加子菜单
     NewAction = fileMenu->addAction("增加IP地址");
     InsertAction = fileMenu->addAction("插入IP地址");
     DeleteAction = fileMenu->addAction("删除IP地址");

    // 分别设置图标
    NewAction->setIcon(QIcon(":/image/1.ico"));
    InsertAction->setIcon(QIcon(":/image/2.ico"));
    DeleteAction->setIcon(QIcon(":/image/3.ico"));

    // ----------------------------------------------------
    // 绑定槽函数
    // ----------------------------------------------------
    connect(NewAction,&QAction::triggered,this,[=](){
        std::cout << "new action" << std::endl;
    });

    connect(InsertAction,&QAction::triggered,this,[=](){
        std::cout << "insert action" << std::endl;
    });

    // 以删除为例,演示如何删除选中行
    connect(DeleteAction,&QAction::triggered,this,[=](){
        int row = ui->listWidget->currentRow();
        QListWidgetItem *aItem = ui->listWidget->takeItem(row);
        delete aItem;
        std::cout << "delete action" << std::endl;
    });
}

接着,当ListWidget右键被点击时,则触发on_listWidget_customContextMenuRequested槽函数,在该槽函数内我们通过new QMenu新建菜单,并通过addAction属性将其插入到被点击位置上,其代码如下所示;

// 当listWidget被右键点击时则触发
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
    std::cout << "x pos = "<< pos.x() << "y pos = " << pos.y() << std::endl;
    Q_UNUSED(pos);

    // 新建Menu菜单
    QMenu *ptr = new QMenu(this);

    // 添加Actions创建菜单项
    ptr->addAction(NewAction);
    ptr->addAction(InsertAction);
    // 添加一个分割线
    ptr->addSeparator();
    ptr->addAction(DeleteAction);

    // 在鼠标光标位置显示右键快捷菜单
    ptr->exec(QCursor::pos());

    // 手工创建的指针必须手工删除
    delete ptr;
}

运行后读者可自行在特定行上点击右键,此时则会弹出菜单栏,如下图所示;

接着来看下图标组的设置与绑定右键菜单的实现方式,第二种方式的绑定与第一种一致,唯一的区别仅仅只是显示设置上的不同,如下是第二种方法的显示配置代码;

// 第二个ListWidget_使用图标方式展示
ui->listWidget_ico->setViewMode(QListView::IconMode);

// 每一行是一个QListWidgetItem
QListWidgetItem *aItem;

// 设置ICON的图标
QIcon aIcon;
aIcon.addFile(":/image/1.ico");

ui->listWidget_ico->clear();
for(int x=0;x<10;x++)
{
    QString str = QString::asprintf("admin_%d",x);
    aItem = new QListWidgetItem();           // 新建一个项

    aItem->setText(str);                     // 设置文字标签
    aItem->setIcon(aIcon);                   // 设置图标
    //aItem->setCheckState(Qt::Checked);     // 设为选中状态
    aItem->setFlags(Qt::ItemIsSelectable |   // 设置为不可编辑状态
                     Qt::ItemIsUserCheckable
                    |Qt::ItemIsEnabled);

    ui->listWidget_ico->addItem(aItem);       // 增加项
}

使用时只需要按照相同的方式绑定菜单即可,运行效果如下图所示;

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

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

相关文章

【网络安全】-Linux操作系统基础

文章目录 Linux操作系统目录结构Linux命令格式Linux文件和目录操作命令Linux用户和用户组操作命令Linux查看和操作文件内容命令Linux文件压缩和解压缩命令Linux网络管理命令Linux磁盘管理和系统状态命令Linux安全加固总结 Linux是一个强大的操作系统&#xff0c;广泛用于服务器…

C# WPF上位机开发(进度条操作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 软件上面如果一个操作比较缓慢&#xff0c;或者说需要很长的时间&#xff0c;那么这个时候最好添加一个进度条&#xff0c;提示一下当前任务的进展…

通过层进行高效学习:探索深度神经网络中的层次稀疏表示

一、介绍 深度学习中的层次稀疏表示是人工智能领域日益重要的研究领域。本文将探讨分层稀疏表示的概念、它们在深度学习中的意义、应用、挑战和未来方向。 最大限度地提高人工智能的效率和性能&#xff1a;深度学习系统中分层稀疏表示的力量。 二、理解层次稀疏表示 分层稀疏表…

【MATLAB】数据拟合第11期-基于粒子群迭代的拟合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于粒子群迭代的拟合算法是一种优化技术&#xff0c;它基于粒子群优化算法&#xff08;PSO&#xff09;的基本思想。该算法通过群体中个体之间的协作和信息共享来寻找最优解。 在基于粒…

探索拉普拉斯算子:计算机视觉中用于边缘检测和图像分析的关键工具

一、介绍 拉普拉斯算子是 n 维欧几里得空间中的二阶微分算子&#xff0c;表示为 ∇。它是函数梯度的发散度。在图像处理的上下文中&#xff0c;该运算符应用于图像的强度函数&#xff0c;可以将其视为每个像素具有强度值的二维信号。拉普拉斯算子是计算机视觉领域的关键工具&am…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十五:基础数据模块相关功能实现

一、本章内容 本章使用已实现的公共组件实现系统管理中的基础数据中的验证码管理、消息管理等功能。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址: 基于VUE3+Layui从头搭建通用后台管理系统合集-验证码功能实现 3.2 西瓜…

不做数据采集,不碰行业应用,专注数字孪生PaaS平台,飞渡科技三轮融资成功秘诀

12月15日&#xff0c;飞渡科技在北京举行2023年度投资人媒体见面会&#xff0c;全面分享其产品技术理念与融资之路。北京大兴经开区党委书记、管委会主任常学智、大兴经开区副总经理梁萌、北京和聚百川投资管理有限公司&#xff08;以下简称“和聚百川”&#xff09;投资总监严…

pytorch实现DCP暗通道先验去雾算法及其onnx导出

pytorch实现DCP暗通道先验去雾算法及其onnx导出 简介实现ONNX导出导出测试 简介 最近在做图像去雾&#xff0c;于是在Pytorch上复现了一下dcp算法。暗通道先验去雾算法是大神何恺明2009年发表在CVPR上的一篇论文&#xff0c;还获得了当年的CVPR最佳论文。 实现 具体原理就不…

麻雀规则设计器maquerule

规则设计器 1、应用场景 目前市场上主要的规则引擎中都可以动态解析脚本语言&#xff0c;比如javascript,drools,aviator。这些语言解析在业务上可以两种方式&#xff0c;一种是开发人员直接把相应的脚本写好&#xff0c;跟随程序一起交付&#xff1b; 第二种就是现场的人员可…

云原生之深入解析如何在K8S环境中使用Prometheus来监控CoreDNS指标

一、什么是 Kubernetes CoreDNS&#xff1f; CoreDNS 是 Kubernetes 环境的DNS add-on 组件&#xff0c;它是在控制平面节点中运行的组件之一&#xff0c;使其正常运行和响应是 Kubernetes 集群正常运行的关键。DNS 是每个体系结构中最敏感和最重要的服务之一。应用程序、微服…

USB2.0 Spec

USB System Description A USB system is described by three definitional areas: • USB interconnect • USB devices • USB host USB interconnect The USB interconnect is the manner in which USB devices are connected to and communicate with the host. USB Ho…

Go集成elasticsearch8极简demo,光速入门

Go集成elasticsearch8极简demo,光速入门 配置go环境创件go mod工程代码实现配置go环境 编辑器添加goproxy GO111MODULE=on;GOPROXY=https://mirrors.wps.cn/go/,https://goproxy.cn,direct;GOSUMDB=off创件go mod工程 mkdir demo cd demo go mod init demo代码实现 在demo…

建行江门市分行致力数字人民币加速融入百姓生活

数字金融是“数字中国”建设的重要组成部分。建行江门市分行主动拥抱数字经济浪潮&#xff0c;全力探索数字金融赋能实体经济和社会民生&#xff0c;不断助力增强人民群众对金融服务的获得感、幸福感和安全感。 缴交住维如此简单&#xff01; 江门是著名侨乡&#xff0c;有40…

对JVM内存模型的理解

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

服务器RAID配置及功能介绍

服务器RAID配置及功能介绍 一、RAID磁盘阵列详解1.RAID磁盘阵列介绍2.RAID 03.RAID14.RAID35.RAID56.RAID67.RAID 10总结阵列卡介绍 一、RAID磁盘阵列详解 1.RAID磁盘阵列介绍 ①是Redundant Array of lndependent Disks的缩写中文简称为独立冗余磁盘阵列。 ②把多块独立的物…

揭秘 `nextTick`:解决异步回调的利器(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

两位技术领导者的故事——英特尔和高通

对于科技行业来说&#xff0c;包括这样一个现实&#xff1a;上学、工作和娱乐实际上是未来生活的一部分。科技行业也面临着变革&#xff0c;行业内发生了几起重大收购和管理层变动。其中两个最具影响力的变化是英特尔和高通的换岗。具有讽刺意味的是&#xff0c;这两家公司在过…

OA、CRM、ERP之间的区别和联系是什么?

OA、CRM、ERP之间的区别和联系是什么&#xff1f; OA、CRM、ERP&#xff0c;这些系统都是用于提高企业运营效率和管理的工具&#xff0c;它们可能在某些功能上有重叠&#xff0c;比如 CRM 和 ERP 可能都涉及到客户数据管理&#xff0c;但它们的重点和功能侧重点是不同的。 我们…

ArrayList的初始化容量与扩容机制解析

目录 1. ArrayList初始化容量 2. ArrayList的扩容机制 2.1. 计算新容量 2.2. 创建新数组并复制数据 2.3. 更新内部数组引用 3. ArrayList扩容的性能优化 3.1. 批量添加元素 3.2. 避免无效的扩容 3.3. 初始容量设定 4. 总结 在Java中&#xff0c;ArrayList是一个非常常…

LeetCode 142. 环形链表 II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…