【Qt 常用控件】多元素控件(QListWidget、QTableWidgt、QTreeWidget)
**View和**Widget的区别?
**View的实现更底层,**Widget是基于**View封装实现的更易用的类型。
**View使用MVC结构
MVC是软件开发中 经典的 软件结构 组织形式,软件设计模式。
M(model)模型。管理应用程序的核心数据和业务逻辑。并且通知视图和控制器数据已经发生变化。
V(view)视图,界面。显示数据,并接受用户输入。
C(controller)控制器。衔接M和V,处理用户输入,更新模型和视图。
**View只负责视图,并不具备其他功能,如数据存储、业务逻辑。
使用**View需要程序员自己写,model和controller部分。
**Widget已经封装好,具备各部分功能,并提供接口设置自定义部分。
1.QListWidget 列表控件
- 功能:显示纵向的列表,每个选项都可以被选中
currentRow 当前被选中的的是第几行 count 一共多少行 sortingEnabled 是否允许排序
isWrapping 是否允许换行 itemAlinment 元素对齐方式 selectRectVisible 被选中元素的矩形是否可见 spacing 元素之间的间隔
- 方法:
addItem(const QString& label)
addItem(QListWidget Item* item)
添加元素 currentItem() 返回QListWidgetItem*,返回当前选中元素指针 setCurrentItem(QListWidgetItem* item) 设置选中元素,参数指针。 setCurrentRow(int row) 设置选中元素,参数行号(从0开始) insertItem(const QString& label,int row) insertItem(QListWidgetItem *item , int row) 指定行号,插入一个新元素。 item(int row) 返回指定行号的元素,返回QListWidgetItem* takeItem(int row) 删除指定行的元素,返回被删除元素的QListWidgetItem*
- 信号:
currentItemChanged(QListWidgetItem* current,QListWidgetItem*old) 选中元素改变时触发。
参数是新当前选中,和上一个选中的元素指针。
currentRowChanged(int) 选中元素改变时触发。
参数是当前选中元素的行号。
itemClicked(QListWidgetItem* item) 点击某个元素时触发。 itemDoubleClicked(QListWidgetItem* item) 双击某个元素时触发。 itemEntered(QListWidgetItem* item) 鼠标悬停在选项之上时触发。
例:通过按钮添加/删除行
#include "widget.h"
#include "ui_widget.h"
#include<QString>
#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(new QListWidgetItem("Python"));}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()//新增选项
{//获取输入框内容QString str=ui->lineEdit->text();if(str==""){return ;}//新增列表选项ui->listWidget->addItem(str);
}void Widget::on_pushButton_2_clicked()//删除元素
{//获取当前选中元素int row=ui->listWidget->currentRow();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.QTableWidget 表格控件
- QTableWidget核心方法:
item(int row, int column) 获取指定行列的元素,QTableWidgetItem* setItem(int row, int column, QTableWidget*) 指定行列,设置单元格的元素 currentItem() 获取当前选中元素 currentRow() 获取当前选中元素的行号 currentColumn() 获取当前选中元素的列号 row(QTableWidgetItem*) 获取指定元素的行号 column(QTableWidgetItem*) 获取指定元素的列号 rowCount() 获取总行数 columnCount() 获取总列数 insertRow(int row) 插入新的一行,在指定行号 insertColumn(int column) 插入新的一列,在指定列号 removeRow(int row) 删除指定行 removeColumn(int column) 删除指定列 setHorizontalHeaderItem(int column, QTableWidget*) 设置水平方向的表头,每一列的表头 setVerticalHeaderItem(int row, QTableWidget*) 设置垂直方向的表头,每一行的表头 QTableWidgetItem核心信号
cellClicked(int row, int column)
点击单元格时触发 cellDoubleClicked(int row,int column) 双击单元格时触发 cellEntered(int row, int column) 鼠标进入单元格时触发 currentCellChanged(int row, int column, int previousRow, int previousColumn) 选中不同单元格时触发
- QTableWidgetItem核心方法
row() 获取元素行号 column() 获取元素列号 setText(const QSting&) 设置文本 setTextAlignment(int) 设置文本对齐方式 setIcon(const QIcon&) 设置图标 setSelected(bool) 设置被选中 setSizeHints(const QSize&) 设置尺寸 setFont(const QFont&) 设置字体
例:通过按钮,添加行/列,删除行/列
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>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("班级"));for(int i=0;i<3;i++){for(int j=0;j<3;j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem("0"));}}}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_insertRow_clicked()
{//默认在末尾插入一行//获取当前的行数int row_count=ui->tableWidget->rowCount();ui->tableWidget->insertRow(row_count);
}void Widget::on_pushButton_insetColumn_clicked()
{int column_count=ui->tableWidget->columnCount();ui->tableWidget->insertColumn(column_count);//设置表头QString s=ui->lineEdit->text();if(s.isEmpty()==true){return ;}ui->tableWidget->setHorizontalHeaderItem(column_count,new QTableWidgetItem(s));
}void Widget::on_pushButton_deleteRow_clicked(bool checked)
{//删除选中的行int current=ui->tableWidget->currentRow();ui->tableWidget->removeRow(current);
}void Widget::on_pushButton_4_clicked()
{//删除选中的行int current=ui->tableWidget->currentColumn();ui->tableWidget->removeColumn(current);
}


行列数过多后,表格会自动添加滚动条。
3.QTreeWidget 树形控件
- 功能:树形控件,每一个元素是QTreeWidgetItem,每个QTreeWidgetItem 可以包含多个⽂本和图标,每个⽂本/图标为⼀个列。
但这个树形结构,不一定只有一个根节点,把顶层节点称为topLevelItem。
- 方法
clear() 清空所有子节点 addTopLevelItem(QTreeWidgetItem* item) 新增顶层节点 topLevelItem(int index) 获取指定下标的顶层节点 topLevelItemCount() 获取顶层节点的个数 indexOfTopLevelItem(QTreeWidgetItem* item) 获取节点在顶层节点中的下标 takeTopLevelItem(int index) 根据下标,删除指定的顶层节点。返回被删除元素指针。
只能这样删除顶层元素,必须先获取下标。
currentItem() 获取当前选中节点的指针 setCurrentItem(QTreeWidgetItem* item) 设置选中节点 setExpanded(bool) 展开/关闭子节点 setHeaderLabel(const QString& text)
setHeaderItem()
设置TreeWidget的header名称
- QTreeWidget核心信号
currentItemChanged(QTreeWidgetItem* current,QTreeWidgetItem* old) 切换选中元素时触发 itemClicked(QTreeWidgetItem* item, int col) 点击元素时触发 itemDoubleClicked(QTreeWidgetItem* item, int col) 双击元素时触发 itemEntered(QTreeWidgetItem* item, int col) 鼠标进入时触发 itemExpanded(QTreeWidgetItem* item) 元素被展开时触发 itemCollapsend(QTreeWidgetItem* item) 元素被折叠时触发 QTreeWidgetItem核心属性
text 文本 textAlign 文本对齐方式 icon 持有的图标 font 字体 hidden
是否隐藏 disabled 是否禁用 expand 是否展开 sizeHint 尺寸大小 selected 是否选中
- QTreeWidgetItem核心方法
addChild(QTreeWidgetItem* child) 新增子节点 childCount() 子节点个数 child(int index) 获取指定下标的子节点,返回指针 takeChild(int index) 删除对应下标的子节点 removeChild(QTreeWidgetItem* child) 删除对应的子节点 parent() 获取该元素的父节点
例:添加节点的方式

图形化方式添加节点

代码方式
#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,"暹罗");QTreeWidgetItem* item5 =new QTreeWidgetItem();item5->setText(0,"加菲");QTreeWidgetItem* item6 =new QTreeWidgetItem();item6->setText(0,"虎斑");item1->addChild(item4);item1->addChild(item5);item1->addChild(item6);}Widget::~Widget()
{delete ui;
}

例:通过按钮,添加顶层节点/普通节点/删除节点
#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,"暹罗");QTreeWidgetItem* item5 =new QTreeWidgetItem();item5->setText(0,"加菲");QTreeWidgetItem* item6 =new QTreeWidgetItem();item6->setText(0,"虎斑");item1->addChild(item4);item1->addChild(item5);item1->addChild(item6);}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_insertTop_clicked()
{QString text=ui->lineEdit->text();if(text.isEmpty()==true){return ;}QTreeWidgetItem* item=new QTreeWidgetItem();item->setText(0,text);ui->treeWidget->addTopLevelItem(item);
}void Widget::on_pushButton_insert_clicked()
{//获取选中的元素QTreeWidgetItem* it=ui->treeWidget->currentItem();if(it==nullptr){return ;}QString text=ui->lineEdit->text();if(text.isEmpty()==true){return ;}QTreeWidgetItem* item=new QTreeWidgetItem();item->setText(0,text);it->addChild(item);}void Widget::on_pushButton_delete_clicked()
{QTreeWidgetItem* it=ui->treeWidget->currentItem();if(it==nullptr){return ;}//获取当前元素的父节点QTreeWidgetItem* parent=it->parent();//父节点为空。说明当前节点为顶层节点//获取当前选中节点的下标if(parent==nullptr){int index=ui->treeWidget->indexOfTopLevelItem(it);ui->treeWidget->takeTopLevelItem(index);//删除顶层节点}else{parent->removeChild(it);}}

上述对界面的操作都是内存级别的操作,程序重启后就会恢复到初始状态。
想要保留操作变化,需要额外的数据持久化操作。写入文件,运行时重写读取文件加载数据。
相关文章:
【Qt 常用控件】多元素控件(QListWidget、QTableWidgt、QTreeWidget)
**View和**Widget的区别? **View的实现更底层,**Widget是基于**View封装实现的更易用的类型。 **View使用MVC结构 MVC是软件开发中 经典的 软件结构 组织形式,软件设计模式。 M(model)模型。管理应用程序的核心数据和…...
Linux 远程文件复制传输-----scp/rsync/sftp
scp(Secure Copy Protocol)是基于 SSH 的安全文件传输工具,可用于在本地和远程计算机之间复制文件或目录。 1. scp(基于 SSH 复制文件) a. 复制文件到远程 从本地复制到远程 scp localfile.txt userremote_host:/remo…...
VS2022中.Net Api + Vue 从创建到发布到IIS
VS2022中.Net Api Vue 从创建到发布到IIS 前言一、先决条件二、创建项目三、运行项目四、增加API五、发布到IIS六、设置Vue的发布 前言 最近从VS2019 升级到了VS2022,终于可以使用官方的.Net Vue 组合了,但是使用过程中还是有很多问题,这里记录一下. 一、先决条件 Visual …...
Windows 11 搭建私有知识库(docker、dify、deepseek、ollama)
一、操作系统信息 版本 Windows 11 家庭中文版 版本号 23H2 安装日期 2023/8/21 操作系统版本 22631.4460二、搭建思路 ollama拉取deepseek、bge-m3模型docker拉取dify的镜像dify链接ollama使用模型,并上传文件搭建知识库,创建应用 三、搭建步骤…...
安装OpenJDK21(linux、macos)
文章目录 安装OpenJDK21java21linux下安装配置mac下安装 安装OpenJDK21 java21 封神!Java 21正式发布了,迎来了史诗级新特性,堪称版本最强!!! 视频链接:https://www.bilibili.com/video/BV1E8…...
变分边界详解
起因 当时看VAE论文时有这么一段,但是看完直接一头雾水,这都那跟哪,第一个公式咋做的变换就变出那么一堆。网上搜了很多博客都语焉不详,只好自己来写一篇,希望能解答后来人的疑惑。 公式1 参考文章:证据…...
Softhsm储存安全数据性能整理
目标:存储百万条数据对象 测试方案一:总大小2GB,每个数据对象大小约512KB,总条数4096条; 测试方案一:总大小2GB,每个数据对象大小约256B,总条数8388608条; 测试环境&am…...
KaiOS 4.0 APN List 界面加载debug
问题背景 在列表选中APN进入编辑后,退出返回列表界面时无法焦点选中编辑的APN。 代码分析 路径:gaia/apps/settings/js/panels/apn_list/panel.js 分析SettingsPanel界面加载的步骤逻辑 onBeforeShow -> onShow -> onBeforeHide -> onHide return SettingsPanel(…...
Next.js 15【实用教程】2025最新版
官网 https://nextjs.org/docs/app/getting-started Next.js 简介 Next.js 由 Vercel 开发和维护,旨在解决单页应用(SPA)和多页应用(MPA)在性能和 SEO 上的不足。 核心特性 服务端渲染(SSR)--…...
2025-02-13 学习记录--C/C++-PTA 7-17 爬动的蠕虫
一、题目描述 ⭐️ 二、代码(C语言)⭐️ #include <stdio.h>int main() {int N, U, D; // N: 井的总高度,U: 每分钟向上爬的高度,D: 每分钟滑下的高度int height 0; // 蠕虫当前的高度int minute 0; // 蠕虫爬行的时间sc…...
Elasticsearch+Logstash+Kibana可视化集群部署
文章目录 1.组件介绍简述2.集群规划3.Es组件部署4.Logstash组件部署5.Kibana组件部署6.Kibana的基础使用 1.组件介绍简述 Elasticsearch:开源实时分布式搜索和分析引擎,支持大规模数据存储和高吞吐量,提供丰富的搜索功能和可扩展性。 Logsta…...
React VS Vue
React 和 Vue 是目前最流行的两个前端框架,它们在设计理念、生态系统和开发体验上各有特点。以下是对 React 和 Vue 的全方位对比: 1. 核心设计理念 React 库而非框架:React 是一个用于构建 UI 的库,专注于视图层,其…...
DeepSeek+Excel 效率翻倍
2025年初,DeepSeek以惊人的效率突破技术壁垒,用极低的成本实现了与行业顶尖AI相媲美的性能,瞬间成为全球科技领域的热门话题。 那么AI工具的普及将如何改变我们的工作方式?Excel会被取代吗? 今天,珠珠带你…...
将Sqlite3数据库挂在内存上处理
创作灵感:最近把小学生的口算题从2位数改到3位数,100以内四则运算练习(千纬数学)再次更新,选取难题-CSDN博客要不断刷题目,以前100以内的加减乘除也是这样刷出来的,代码如下: impor…...
Vue3.5 企业级管理系统实战(六):Vue3中defineProps用法
上一节封装图标组件 SvgIcon 时,用到了 defineProps,因为它在开发中的重要性,这里简单看一下它的用法,已熟知用法的此节可跳过。 在 Vue3 的组件化开发体系里,组件间通信是构建高效、可维护应用程序的核心环节。defin…...
HTTP/2 由来及特性
HTTP/2 的由来 HTTP/1.x 的局限性 性能瓶颈 队头阻塞问题:在HTTP/1.x中,一个TCP连接在同一时间只能处理一个请求,后续请求必须等待前面的请求处理完成并收到响应后才能被处理。例如,当一个页面有多个资源(如图片、脚…...
electron.vite 项目创建以及better-sqlite3数据库使用
1.安装electron.vite npm create quick-start/electronlatest中文官网:https://cn.electron-vite.org/ 2. 安装项目依赖 npm i3.修改 electron-builder 配置文件 appId: com.electron.app productName: text33 directories:buildResources: build files:- !**/.v…...
蓝桥杯 Java B 组之枚举算法(暴力破解)
Day 3:枚举算法(暴力破解) 枚举算法(Brute Force)是一种 暴力搜索 方法,它通过 遍历所有可能的情况 来找到正确答案。虽然它的 时间复杂度较高,但在 数据范围较小 时,它是一种简单且…...
AI 控制web浏览器基础知识准备,名词解释Xvfb,x11vnc,novnc,playwright,gradio
在探索如何让AI控制Web浏览器实现自动化任务时,了解底层技术栈是关键。本文将解析五个核心组件:Xvfb、x11vnc、novnc、playwright和gradio,这些工具共同构成了AI驱动浏览器的基础架构。 1. Xvfb(X Virtual Framebuffer࿰…...
C++,STL容器适配器,stack:栈深入解析
文章目录 一、容器概览与核心特性核心特性速览二、底层实现原理1. 容器适配器设计2. 默认容器对比三、核心操作详解1. 容器初始化2. 元素操作接口3. 自定义栈实现四、实战应用场景1. 括号匹配校验2. 浏览器历史记录管理五、性能优化策略1. 底层容器选择基准2. 内存预分配技巧六…...
Vue笔记(十)
一、AI的基本认知 二、ChatGPT的基本使用 三、AI插件--Copilot入门 1.Copilot是由OpenAI和GitHub合作开发的AI编程辅助插件,基于大量代码训练,能根据上下文自动生成代码建议。 2.安装与配置:在常用代码编辑器(如Visual Studio Cod…...
Ubuntu下载安装Docker-Desktop
下载 Ubuntu | Docker Docs 预备工作 Ubuntu增加docker apt库-CSDN博客 安装 sudo apt-get updatesudo apt install gnome-terminal# sudo apt install -y docker-composesudo apt-get install ./docker-desktop-amd64.deb 测试 sudo docker run hello-worldHello from D…...
DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?
随着人工智能技术的飞速发展,大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世,为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲!!! 目录 一、…...
C#运动控制——轴IO映射
1、IO映射的作用 该功能允许用户对专用 IO 信号的硬件输入接口进行任意配置,比如轴的急停信号,通过映射以后,可以将所有轴的急停信号映射到某一个IO输入口上,这样,我们只要让一个IO信号有效就可以触发所有轴的急停。 进…...
ArrayList、LinkedList、HashMap、HashTable、HashSet、TreeSet
集合族谱 在这些集合中,仅有vector和hashtable是线程安全的,其内部方法基本都有synchronized修饰。 ArrayList 底层采用Object数组实现,实现了RandomAccess接口因此支持随机访问。插入删除操作效率慢。 ArrayList需要一份连续的内存空间。 A…...
DeepSeek 指导手册(入门到精通)
第⼀章:准备篇(三分钟上手)1.1 三分钟创建你的 AI 伙伴1.2 认识你的 AI 控制台 第二章:基础对话篇(像交朋友⼀样学交流)2.1 有效提问的五个黄金法则2.2 新手必学魔法指令 第三章:效率飞跃篇&…...
window 11 鼠标右键切换回经典模式
window 11 鼠标右键切换回经典模式 在换新电脑,更新到 window 11 后,鼠标右键很不习惯,把很多功能都隐藏到最后一个打开更多模块了,删除以及刷新等操作也不能使用右键字母快捷操作。 恢复window 11 右键菜单到经典模式 方法一&am…...
RabbitMQ 延迟队列
1.延迟队列插件安装(版本号要对其) Releases rabbitmq/rabbitmq-delayed-message-exchange GitHub 下载的文件: rabbitmq_delayed_message_exchange-3.13.0.ez 直接复制到以下文件夹: \RabbitMQ Server\rabbitmq_server-3.13.7\plugins\ 执行命令…...
Unity3D 类MOBA角色控制器 开箱即用
Github: Unity3D-MOBA-Character-Controller 觉得好用麻烦点个Star感谢!...
认识一下redis的分布式锁
Redis的分布式锁是一种通过Redis实现的分布式锁机制,用于在分布式系统中确保同一时刻只有一个客户端可以访问某个资源。它通常用于防止多个应用实例在同一时间执行某些特定操作,避免数据的不一致性或竞争条件。 实现分布式锁的基本思路: 1. …...

