【Qt学习】多元素控件:QListWidget、QTableWidget 的介绍与使用

news2025/4/22 8:54:23

文章目录

  • 1. QListWidget
    • 1.1 介绍
    • 1.2 使用 - 如何添加项目
    • 1.3 实例
    • 1.4 资源文件
  • 2. QTableWidget
    • 2.1 介绍
    • 2.2 使用 - 添加项目的方式
    • 2.3 实例
    • 2.4 资源文件
  • 3. QTreeWidget
    • 3.1 介绍
    • 3.2 使用 - 添加数据的方式
    • 3.3 实例
    • 3.4 资源文件

1. QListWidget

1.1 介绍

QListWidget 是 Qt 框架中用于显示列表项的控件,它支持显示文本、图标等信息,并且可以允许用户通过交互选择其中的项。

QListWidget 有以下核心函数(方法)

函数描述
addItem在列表中添加新的数据项
insertItem在指定位置插入新的数据项
takeItem从列表中移除指定的数据项并返回该数据项
clear清空列表中所有的数据项
sortItems根据指定的方式对列表中的数据项进行排序
scrollToItem滚动列表以确保指定的数据项可见
setSelectionMode设置列表中的选择模式,可以为单选、多选等
setDragEnabled设置列表中的拖放功能是否启用
setDropIndicatorShown设置拖放操作时是否显示插入指示器,该指示器可以提示用户将数据项拖放到哪个位置
setCurrentRow设置当前选中的行,可以结合 currentRowChanged 信号使用来实现响应功能
setCurrentItem设置当前选中的数据项,可以结合 currentItemChanged 信号使用来实现响应功能
count返回列表中的数据项数量

QListWidget核心槽函数:

槽函数说明
currentRowChanged当选中的行发生变化时发出信号,可以连接到槽函数中实现响应功能
currentItemChanged当选中的数据项发生变化时发出信号,可以连接到槽函数中实现响应功能
itemClicked当用户单击某个数据项时发出信号,可以连接到槽函数中实现响应功能
itemDoubleClicked当用户双击某个数据项时发出信号,可以连接到槽函数中实现响应功能
itemSelectionChanged当选择的数据项发生变化时发出信号,可以连接到槽函数中实现响应功能

1.2 使用 - 如何添加项目

QListWidget中添加项目的方式有两种:

  1. 在图形化界面直接右键添加
  2. 通过代码添加

这里一一进行演示:

通过图形化界面添加

在这里插入图片描述

  1. 通过点击上面的编辑项目进行添加:

在这里插入图片描述
2. 添加完毕后,直接点击确认,列表项就会自动添加到 QListWidget中。

  • 同样的,可以在属性栏中设置字体属性等;

通过图形化界面添加

利用内置的addItem()函数进行添加,例如:

ui->listWidget->addItem(new QListWidgetItem("item1"));

同理,也可以用代码设置添加的项目的属性;


1.3 实例

这里我们实现一个功能:利用输入框和按钮 实现 增行删行的操作

  1. 首先在图形化界面中进行如下布局:

在这里插入图片描述

  1. widget.cpp中编写QListWidget的槽函数:
    • 用于当列表项发生变化时,更改label的显示内容
// 列表项发生变化时 触发
void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
    if(current)
        ui->label_current->setText("当前选中的元素: " + current->text());
    else
        ui->label_current->setText("当前选中的元素: ");

    if(previous)
        ui->label_previous->setText("此前选中的元素: " + previous->text());
    else
        ui->label_previous->setText("此前选中的元素: ");
}
  1. 随后在widget.cpp中分别编写两按钮控件的槽函数:
void Widget::on_pushButton_add_clicked()
{
    // 1. 获取输入框内的内容
    QString text_input = ui->lineEdit->text();
    // 2. 将获取内容添加到QListWidget中
    ui->listWidget->addItem(text_input);
}

void Widget::on_pushButton_delete_clicked()
{
    // 1. 获取被选中的元素
    int row = ui->listWidget->currentRow();
    if(row < 0) return;
    // 2. 按行号进行删除
    ui->listWidget->takeItem(row);
}

效果展示

请添加图片描述

1.4 资源文件

关于实例使用的代码等资源文件在👇

QListWidget的使用

2. QTableWidget

2.1 介绍

QTableWidget 是 Qt 框架中用于显示表格数据的控件。它是基于 QListWidget 的增强版本,提供了更丰富的功能和灵活的使用方式。

QTableWidget有以下核心函数(方法)

槽函数描述
setItem设置指定单元格的数据项
takeItem从指定单元格中移除数据项并返回该数据项
clearContents清除表格中所有单元格的内容
sortItems根据指定的方式对表格中的数据进行排序
scrollToItem滚动表格以确保指定的单元格可见
setSelectionMode设置表格中的选择模式,可以为单选、多选等
setHorizontalHeaderLabels设置水平表头的标签
setVerticalHeaderLabels设置垂直表头的标签
setRowCount设置表格的行数
setColumnCount设置表格的列数

QTableWidget有以下核心槽函数

槽函数说明
itemClicked当用户单击某个单元格时发出信号,可以连接到槽函数中实现响应功能
itemDoubleClicked当用户双击某个单元格时发出信号,可以连接到槽函数中实现响应功能
itemSelectionChanged当选择的单元格发生变化时发出信号,可以连接到槽函数中实现响应功能
cellChanged当单元格数据发生变化时发出信号,可以连接到槽函数中实现响应功能
currentCellChanged当当前选中的单元格发生变化时发出信号,可以连接到槽函数中实现响应功能
currentCellChanged当当前选中的单元格发生变化时发出信号,可以连接到槽函数中实现响应功能
cellActivated当用户激活(双击或按下回车键)某个单元格时发出信号,可以连接到槽函数中实现响应功能
cellClicked当用户单击某个单元格时发出信号,可以连接到槽函数中实现响应功能
cellDoubleClicked当用户双击某个单元格时发出信号,可以连接到槽函数中实现响应功能
cellEntered当鼠标进入某个单元格时发出信号,可以连接到槽函数中实现响应功能

2.2 使用 - 添加项目的方式

与QListWidget类似,有两种添加项目的方式:

  1. 图形化界面直接添加
  2. 代码添加

图形化界面添加

在这里插入图片描述
同理,根据”编辑项目“,可以直接对QTableWidget类进行操作:
在这里插入图片描述

代码添加

代码添加例如:

// 创建 QTableWidget 对象
QTableWidget *tableWidget = new QTableWidget(parent);

// 设置表格的行数和列数
tableWidget->setRowCount(4);
tableWidget->setColumnCount(3);

// 设置表格的水平表头标签
tableWidget->setHorizontalHeaderLabels({"姓名", "年龄", "性别"});

// 在指定位置添加单元格数据
tableWidget->setItem(0, 0, new QTableWidgetItem("李田所"));
tableWidget->setItem(0, 1, new QTableWidgetItem("24"));
tableWidget->setItem(0, 2, new QTableWidgetItem("男"));

// 显示 QTableWidget
tableWidget->show();

2.3 实例

本例我们实现四个按钮,分别 控制表格中行与列的增加与删除:

  1. 首先在图形化界面进行布局:

在这里插入图片描述
2. 分别编写四个按钮的槽函数:

插入新行

// 插入新行
void Widget::on_pushButton_addRow_clicked()
{
    // 获取当前选中的行号
    int currentRow = ui->tableWidget->currentRow();

    if (currentRow >= 0) {
        // 如果有选中行,则在选中位置插入新行
        ui->tableWidget->insertRow(currentRow);
    } else {
        // 如果没有选中行,则在尾部插入新行
        currentRow = ui->tableWidget->rowCount();
        ui->tableWidget->insertRow(currentRow);
    }

    // 获取 QLineEdit 中输入的数据
    QString input = ui->lineEdit_input->text();

    // 设置新行的行名
    QTableWidgetItem *headerItem = new QTableWidgetItem(input);
    ui->tableWidget->setVerticalHeaderItem(currentRow, headerItem);

    // 清空之前的选中状态
    ui->tableWidget->clearSelection();

    // 选中新插入的行
    ui->tableWidget->selectRow(currentRow);
}

删除行

void Widget::on_pushButton_deleteRow_clicked()
{
    // 获取选中行号
    int curRow = ui->tableWidget->currentRow();
    // 删除选中行
    ui->tableWidget->removeRow(curRow);
}

同理,新增列、删除列:

void Widget::on_pushButton_addCol_clicked()
{
    // 获取选中列号
    int currentCol = ui->tableWidget->currentColumn();
    if(currentCol >= 0){
        ui->tableWidget->insertColumn(currentCol); // 在当前列的后面插入新列
    }else{
        currentCol = ui->tableWidget->columnCount();
        ui->tableWidget->insertColumn(currentCol); // 在尾部插入新列
    }

    // 获取QLineEdit的数据
    QString input = ui->lineEdit_input->text();

    // 将数据作为列名
    QTableWidgetItem *headerItem = new QTableWidgetItem(input);
    ui->tableWidget->setHorizontalHeaderItem(currentCol, headerItem);

    // 清空之前的选中状态
    ui->tableWidget->clearSelection();

    // 选中新插入的列
    ui->tableWidget->selectColumn(currentCol);
}

void Widget::on_pushButton_deleteCol_clicked()
{
    int curCol = ui->tableWidget->currentColumn();
    ui->tableWidget->removeColumn(curCol);
}

效果展示

请添加图片描述

2.4 资源文件

关于实例使用的代码等资源文件在👇

QTableWidget的使用


3. QTreeWidget

3.1 介绍

QTreeWidget 是 Qt 框架提供的一个用于显示树形结构数据的控件,可以展示包含父子关系的数据,并且支持展开、折叠、选择等操作。

QTreeWidget 核心函数(方法)

函数描述
addTopLevelItem(QTreeWidgetItem *item)向树中添加顶级项目。
insertTopLevelItem(int index, QTreeWidgetItem *item)在指定位置插入顶级项目。
takeTopLevelItem(int index)从指定位置移除顶级项目。
invisibleRootItem()返回树的不可见根项目。
clear()清除树中所有项目。
topLevelItem(int index)返回指定索引处的顶级项目。
setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget)在指定项目和列上设置自定义小部件。
expandAll()展开所有项目。
collapseAll()折叠所有项目。

常用的核心槽函数:

槽函数描述
itemClicked(QTreeWidgetItem *item, int column)当项目被单击时触发。
itemDoubleClicked(QTreeWidgetItem *item, int column)当项目被双击时触发。
itemSelectionChanged()当项目选择发生变化时触发。

3.2 使用 - 添加数据的方式

和之前一样,有两种方式:

  1. 图形化界面直接添加
  2. 代码添加

图形化界面添加

在这里插入图片描述

通过代码添加

// 设置根节点的名字
ui->treeWidget->setHeaderLabel("数据集");

// 新增顶层节点
QTreeWidgetItem* item1 = new QTreeWidgetItem();
// 每个节点都可以设置多个列,这里仅设一列
item1->setText(0, "子数据1");
// 添加到顶层节点中
ui->treeWidget->addTopLevelItem(item1);

// 添加子节点
QTreeWidgetItem* item1_1 = new QTreeWidgetItem();
item1_1->setText(0, "项目1");
item1->addChild(item1_1);

3.3 实例

该例实现功能:对于一个QTreeWidget,可以 通过按钮添加节点、子节点、删除节点。

  1. 首先在图形化界面进行布局:

在这里插入图片描述
2. 编写按钮的槽函数:

添加到顶层

// 添加到顶层
void Widget::on_pushButton_addToTop_clicked()
{
    QString text = ui->lineEdit_input->text(); // 获取输入框内容
    
    QTreeWidgetItem* item = new QTreeWidgetItem(); // 构造一个QTreeWidgetItem
    item->setText(0, text);
    // 添加到顶层节点
    ui->treeWidget->addTopLevelItem(item);
}

添加到选中元素

// 添加到选中元素
void Widget::on_pushButton_addToSelect_clicked()
{
    // 获取当前选中的节点
    QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
    if (currentItem == nullptr) return;
    
    QString text = ui->lineEdit->text(); // 获取输入框的内容

    QTreeWidgetItem* item = new QTreeWidgetItem(); // 构造一个 QTreeWidgetItem
    item->setText(0, text);
    
    currentItem->addChild(item); // 插入到选中节点的子节点中
}

删除 选中

void Widget::on_pushButton_deleteSelect_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);
    }
}

效果展示

请添加图片描述

3.4 资源文件

关于实例使用的代码等资源文件在👇

QTreeWidget的使用

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

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

相关文章

【粉丝福利第一期】小 明

Q1 - 能否自我介绍下&#xff1f; 嗨&#xff0c;大家好&#xff0c;我是 小 明 &#xff08;小明java问道之路&#xff09;&#xff0c;互联网大厂后端研发专家&#xff0c;2022博客之星TOP3/博客专家/CSDN后端内容合伙人、InfoQ(极客时间)签约作者、阿里云签约博主、全网5万…

CentOS7如何使用Docker部署Wiki.Js知识库并实现公网远程访问?

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

请你画出一个微服务项目架构图

第一种 架构图 第二种 架构图

第四十五回 病关索大闹翠屏山 拚命三火烧祝家店-Python函数接受任意关键字参数

官府得到上报&#xff0c;被杀死的僧人是报恩寺的裴如海&#xff0c;旁边的头陀是寺后面的人叫胡道。孔目说他们两个互相杀死&#xff0c;没有其他人什么事&#xff0c;这件事也就过去了。 杨雄听说了这件事&#xff0c;知道是石秀干的&#xff0c;找石秀为自己错怪他道歉。两…

杭电OJ 2030 汉字统计 C++

#include <string> #include <iostream> using namespace std; int main() { int n; string s; cin >> n; getchar(); while (n--) { getline(cin, s); //读取一行 int count 0; for (int i 0; i < s.len…

鸿蒙Harmony应用开发—ArkTS声明式开发(触摸事件)

当手指在组件上按下、滑动、抬起时触发。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 onTouch onTouch(event: (event: TouchEvent) > void) 手指触摸动作触发该回调。 卡片能力&#xff1a; 从…

如何在Linux使用Docker部署Nexus容器并实现公网访问本地仓库【内网穿透】

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

正向代理的反爬虫与防DDoS攻击:保护网站免受恶意行为

目录 前言 一、正向代理的原理 二、正向代理的反爬虫功能 1. IP地址隐藏 2. 请求多样化 三、正向代理的防DDoS攻击功能 1. 均衡负载 2. IP过滤 结论 前言 在当前互联网环境下&#xff0c;网站常常受到各种恶意行为的侵袭&#xff0c;其中包括爬虫和DDoS攻击。这些行为…

GEE:基于Landsat5/7/8/9数据提取一个点的NDVI时间序列(1986-2024)

作者:CSDN @ _养乐多_ 本文将介绍,基于Landsat5/7/8/9数据提取一个点的NDVI时间序列,时间序列数据可以是1986-2024年所有可用数据,也可以是月度合成、年度合成或者指定间隔合成的时间序列。 结果如下图所示, 文章目录 一、代码框架二、代码链接三、完整代码一、代码框架…

【JavaEE进阶】 Spring AOP详解

文章目录 &#x1f38b;前言&#x1f38d;Spring AOP核心概念&#x1f6a9;切点(Pointcut)&#x1f6a9;连接点(Join Point)&#x1f6a9;通知(Advice)&#x1f6a9;切面(Aspect) &#x1f340;通知类型&#x1f6a9;注意事项 &#x1f332;PointCut&#x1f384;切面优先级Ord…

使用分布式锁解决分布式环境下的并发安全问题

分布式锁 分布式锁的基本概念 在我们进行单机应用开发&#xff0c;涉及并发同步的时候&#xff0c;我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题&#xff0c;这时多线程的运行都是在同一个JVM之下。但当我们的应用是分布式集群工作的情况下&#xff…

LeetCode 2120.执行所有后缀指令

现有一个 n x n 大小的网格&#xff0c;左上角单元格坐标 (0, 0) &#xff0c;右下角单元格坐标 (n - 1, n - 1) 。给你整数 n 和一个整数数组 startPos &#xff0c;其中 startPos [startrow, startcol] 表示机器人最开始在坐标为 (startrow, startcol) 的单元格上。 另给你…

如何选择合适的汽车芯片ERP系统?

随着汽车产业的飞速发展&#xff0c;汽车芯片作为关键组件&#xff0c;其管理变得愈发重要。为了高效管理汽车芯片的生产、销售、库存等各个环节&#xff0c;许多企业开始引入汽车芯片ERP(企业资源规划)系统。那么&#xff0c;如何选择合适的汽车芯片ERP系统呢? 明确需求是关键…

vue - - - - - vue3使用draggable拖拽组件

vue3使用draggable拖拽组件 一、组件安装二、插件使用三、遇到的问题1. missing required prop&#xff1a; “itemKey” 一、组件安装 yarn add vuedraggablenext // or npm i -S vuedraggablenext二、插件使用 <template><draggableitem-key"id"class&q…

STM32F103学习笔记(七) PWR电源管理(原理篇)

目录 1. PWR电源管理简介 2. STM32F103的PWR模块概述 2.1 PWR模块的基本工作原理 2.2 电源管理的功能和特点 3. PWR模块的常见应用场景 4. 常见问题与解决方案 1. PWR电源管理简介 PWR&#xff08;Power&#xff09;模块是STM32F103系列微控制器中的一个重要组成部分&…

【C语言】while循环语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

基础小白快速入门Python---->作用域是个啥?

在Python代码中&#xff0c;我们经常会使用到一个名词&#xff0c;作用域&#xff0c;那么&#xff0c;作用域究竟是个啥&#xff1f; 不同的编程语言中&#xff0c;作用域搭配使用的模块或者具体名称可能会略有差别 作用域是个啥&#xff1f; 作用域&#xff0c;就像是我们学…

【MySQL】学习多表查询和笛卡尔积 - 副本

](https://img-blog.csdnimg.cn/21dd41dce63a4f2da07b9d879ad0120b.png#pic_center) ??个人主页: ??热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ??个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-N8PeTKG6uLu4bJuM {font-family:“trebuchet ms”,…

安卓开发1- android stdio环境搭建

安卓开发1-android stdio环境搭建 Jdk环境搭建 1. 准备Jdk,这边已经准备好了jdk1.8.0,该文件直接使用即可 2. 系统变量添加 %JAVA_HOME%\bin JAVA_HOME 3. 系统变量&#xff0c;Path路径添加 4. 添加完成后&#xff0c;输入命令javac / java -version&#xff0c;验证环…

python实现跨进程(跨py文件)通信01

前言 项目中总会遇到数据需要跨进程通信的问题&#xff0c;今天就给大家带来一套简单的跨进程通信代码。代码分为服务端与客户端两部分。 一、server端 import multiprocessing import timedef do_socket(conn, addr, ):try:while True:if conn.poll(1) False:time.sleep(0…