QT跨平台应用程序开发框架(8)—— 多元素控件

目录

一,关于多元素控件

 二,QListWidget

2.1 主要方法

2.2 实现新增删除

三,Table Widget

3.1 主要方法

3.2 代码演示

四,Tree Widget

4.1 主要方法

4.2 代码演示

一,关于多元素控件

多元素控件就是一个控件里面包含了很多的元素,可能是字符串,也可能是复杂的数据结构、图片等等,多元素控件有很多,典型的有6个:

  • 列表:QListWidget,QListView
  • 表格:QTableWidget,QTableView
  • 树形:QTreeWidget,QTreeView

可以发现,说是6个控件,其实是3个,只是两两一组而已

问题:xxWidget 和 xxView 是什么关系?

解答

  • 可以理解为 xxView 是很底层的实现,然后 xxWidget 是基于 xxView 的封装而来
  • xxView 是 MVC 结构的一种典型实现,但 xxView 只负责实现了食物,不负责数据如何存储显示,也不负责数据和视图之间的交互
  • 因此程序猿需要自动实现 model 和 controller 部分来使用 xxView,比较麻烦
  • 所以Qt 为我们提供了 xxWidget,为我们实现好了 model 和 controller 并提供了功能很方便的 API,我们直接用就好

问题:什么是MVC?

解答: MVC 全称 “Model-View-Controller”,是一种软件涉及典范,是软件开发中非常经典的一种软件结构

  • M:model,表示模型,或者叫数据,负责存取数据,并在数据变化时更新控制器
  • V:view,表示视图,或者叫界面,负责展示模型中的数据,并提供用户界面
  • C:Controller,表示控制器,是处理模型和视图之间的业务流程,接收用户输入,并调用模型和视图去完成用户的需求

 二,QListWidget

2.1 主要方法

QListWidget 能够显示一个纵向的列表,并且每个选项都可以被选中, 和下拉按钮行为类似

主要属性:

属性说明
currentRow当前被选中的是第几行
count一共多少行
sortingEnabled是否允许排序
isWrapping是否允许换行
itemAlignment元素的对齐方式
selectRectVisible被选中的元素矩阵是否可见(默认背景蓝色)
spacing元素之间的间隔

常用的函数如下:

函数说明

addItem(const QString& label)

addItem(QListWidgetItem* item)

列表中添加元素

列表中的每一项称为一个item,具体的说通过 QListWidgetgetItme 类表示的

currentItem()返回 QListWidgetgetItem* 表示当前选中的元素
setCurrentItem(QListWidgetItem* item)设置选中哪个元素
setCurrentRow(int row)设置选中第几行元素

insertItem(const QString& label, int row)

insertItem(QListWidgetItem* item, int row)

在指定位置插入元素,插在指定位置之前
item(int row)返回 QListWidgetItem*,表示第 row 行的元素
takeItem(int row)删除指定行的元素,返回 QListWidgetItem* ,表示是哪个元素被删除了

常用的信号如下:

信号说明
currentItemChanged(QListWidgetItem* current, QListWidgetItem* old)选中不同元素时触发,参数是当前选中的元素和之前选中的元素
currentRowChanged(int)选中不同元素时触发,参数是当前选中元素的行数
itemClicked(QListWidgetItem* item)点击某个元素时触发
itemDoubleClicked(QListWidgetItem* item)双击某个元素时触发
itemEntered(QListWidgetItem* item)鼠标进入元素时触发鼠标进入元素时触发

上面说到了QListWidgetItem 类,这个类是负责表示 QListWidget 中的一个元素,本质上由“文本 + 图标”构成,常用方法如下:

方法说明
setFont设置字体
setIcon设置图标
setHidden设置隐藏
setSizeHint设置尺寸
setSelected设置是否选中
setText设置文本
setTextAlignment设置文本对齐方式

2.2 实现新增删除

先创建下列控件:

两个都可以,因为可以转换,如下:

代码如下:

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QShortcut>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//    ui->listWidget->addItem("C++");
//    ui->listWidget->addItem("Pyhton");
//    ui->listWidget->addItem("Java");ui->listWidget->addItem(new QListWidgetItem("C++"));ui->listWidget->addItem(new QListWidgetItem("Python"));ui->listWidget->addItem(new QListWidgetItem("Java"));//两种方式都可以添加,也可以直接在ui界面例右键编辑项目添加//QListWidgetItem 也可以设置字体属性,图标,大小等等
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_insert_clicked()
{const QString& text = ui->lineEdit->text(); //先获取输入框的内容ui->listWidget->addItem(text); //将内容添加到表格里
}void Widget::on_pushButton_delete_clicked()
{int row = ui->listWidget->currentRow(); //先获取被选中的元素if(row < 0) return;ui->listWidget->takeItem(row);
}

效果如下:

三,Table Widget

3.1 主要方法

这个表示一个表格控件,简单来说就是就是类似二维数组的结构,表格中的每个单元格是一个 QTableWidgetItem 对象,常用方法如下:

方法说明
item(int row, int column)根据行数列数获取指定的 QtableWidgetItem*
item(int row, int column)根据行数列数设置表格中的元素
currentItem()返回被选中的元素 QTableWidgetItem*
currentRow()返回被选中的元素是第几行
currentColumn()返回被选中的元素第几列
row(QTableWidgetItem*)获取指定 item 是第几行
column(QTableWidgetItem*)获取指定 item 是第几列
rowCount()获取行数
columnCount()获取列数
insertRow(int row)在第 row 行处插入新行
insertColumn(int column)在第 column 行处插入新列
removeRow(int row)删除第 row 行
removeColumn(int column)删除第 column 行
setHorizontalHeaderItem(int column,  QTableWidget*)设置指定列的表头
setVerticalHeaderItem(introw, QTableWidget*)设置指定行的表头

主要的信号如下:

信号说明
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 和上面的 QListWidgetItem 类似,主要方法如下:

方法说明
row()获取当前是第几行
column()获取当前是第几列
setText(const QString&)设置文本
setTextAlignment(int)设置文本对齐
setIcon(const QIcon&)设置图标
setSelected(bool)设置被选中
setSizeHints(const QSize&)设置尺寸
setFont(const QFont&)设置字体

3.2 代码演示

先创建下列控件:

我们先往表格里添加部分元素,在代码添加太麻烦,所以我们这里直接右键编辑项目添加:

所以下面我们也使用文件来进行初始化数据,通过代码初始化表格:

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("21"));ui->tableWidget->setItem(2, 0, new QTableWidgetItem("1003"));ui->tableWidget->setItem(2, 1, new QTableWidgetItem("王五"));ui->tableWidget->setItem(2, 2, new QTableWidgetItem("19"));
}

四个槽函数实现如下:

void Widget::on_pushButton_addRow_clicked()
{int rowCount = ui->tableWidget->rowCount(); //获取总行数ui->tableWidget->insertRow(rowCount); //在最后一行新增行,这个参数是下标,所以不需要 + 1
}void Widget::on_pushButton_subRow_clicked()
{int subRow = ui->tableWidget->currentRow(); //获取到选中的行号ui->tableWidget->removeRow(subRow); //删除这一行
}void Widget::on_pushButton_addColumn_clicked()
{int columnCount = ui->tableWidget->columnCount(); //获取总列数ui->tableWidget->insertColumn(columnCount); //在最后一列添加列const QString& text = ui->lineEdit->text(); //获取输入框里的列名ui->tableWidget->setHorizontalHeaderItem(columnCount, new QTableWidgetItem(text)); //给新增列添加列名
}void Widget::on_pushButton_subColumn_clicked()
{int subColumn = ui->tableWidget->currentColumn(); //获取选中的列号ui->tableWidget->removeColumn(subColumn);
}

效果如下:

默认情况下表格内容是可编辑的,但是如果不想让用户编辑,可以设置下列属性:

ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

四,Tree Widget

4.1 主要方法

QTreeWidget 表示一个树形控件,里面的每个元素都是一个 QTreeWidgetItem,这个类可以包含多个文本和图标,每个文本/图标为一个列 

构建一颗树是先给 QTreeWidget 设置主节点,然后再添加子节点,就和二叉树或者多叉树那样

QTreeWidget 常用的方法如下:

方法说明
clear清空所有子节点
addTopLevelItem(QTreeWidgetItem* item)新增顶层节点
topLevelItem(int index)获取指定下标的顶层节点
topLevelItemCount()获取顶层节点个数
indexOfTopLevelItem(QTreeWidgetItem* item)查询指定节点是顶层节点中的下标
takeTopLevelItem(int index)

删除指定的顶层节点

返回QTreeWidgetItem*表示被删除的元素

currentItem()获取到当前选中的节点,返回QTreeWidgetItem*
setCurrentItem(QTreeWidgetItem* item)选中指定节点
setExpanded(bool)展开/关闭节点
setHeaderLabel(constQString& text)设置TreeWidget 的 header 名称

关于顶层节点

上面的顶层节点,并不是单指根节点,因为QTreeWidget 的树形结构,没有体现出根节点,是从根节点的下一层子节点开始计算的,如下图:

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持有的文本
textAlignment文本对齐方式
icon持有的图表
font文本字体
hidden是否隐藏
disabled是否禁用
expand是否展开
sizeHint尺寸大小
selected是否选中

QTreeWidgetItem 核心方法:

方法说明
addChild(QTreeWidgetItem* child)新增子节点
childCount()子节点的个数
child(int index)获取指定下标的子节点.返回QTreeWidgetItem*
takeChild(int index)删除对应下标的子节点
removeChild(QTreeWidgetItem* child)删除对应的子节点
parent()获取该元素的父节点

4.2 代码演示

先创建下列控件:

初始化数据我们可以通过 ui界面右键编辑项目直接添加,也可以通过代码添加,和上面的表格是一样的,下面是通过代码初始化元素的代码:

//篇幅原因这里也只添加部分元素
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);
}

下面是三个按钮的槽函数实现:

void Widget::on_pushButton_insertTopLevelItem_clicked()
{const QString& text = ui->lineEdit->text(); //获取输入框内容QTreeWidgetItem* item = new QTreeWidgetItem();//构造 QTreeWidget 对象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* item = new QTreeWidgetItem();//构造 QTreeWidget 对象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); //普通元素直接删除即可}
}

上述几个控件相关的操作,数据都是在内存中保存的,重新运行程序后,数据都会重置

所以要想数据不被丢失,就得需要和“学生管理系统”一样,实现一个“保存数据到文件”和“从文件读取数据”的两个操作,每次运行程序时读取文件数据,每次关闭程序时,在析构函数里添加保存文件的操作 

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

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

相关文章

【React Native】环境变量和封装 fetch

环境变量和封装fetch 环境变量 一般做开发&#xff0c;都会将接口地址配置到环境变量里。在Expo建的项目里&#xff0c;也可以使用环境变量。 在项目根目录新建一个.env文件&#xff0c;里面添加上&#xff1a; EXPO_PUBLIC_API_URLhttp://localhost:3000如果你用手机真机等…

Linux 基础命令详解:从入门到实践(1)

Linux 基础命令详解&#xff1a;从入门到实践&#xff08;1&#xff09; 前言 在 Linux 操作系统中&#xff0c;命令行是高效管理系统、操作文件的核心工具。无论是开发者、运维工程师还是Linux爱好者&#xff0c;掌握基础命令都是入门的第一步。本文将围绕Linux命令的结构和常…

基于 SpringBoot+VueJS 的私人牙科诊所管理系统设计与实现

基于 SpringBootVueJS 的私人牙科诊所管理系统设计与实现摘要随着人们对口腔健康重视程度的不断提高&#xff0c;私人牙科诊所的数量日益增多&#xff0c;对诊所管理的信息化需求也越来越迫切。本文设计并实现了一个基于 SpringBoot 和 VueJS 的私人牙科诊所管理系统&#xff0…

华为云Flexus+DeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建天气预报大模型

华为云FlexusDeepSeek征文&#xff5c;体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建天气预报大模型 什么是华为云ModelArts 华为云ModelArts ModelArts是华为云提供的全流程AI开发平台&#xff0c;覆盖从数据准备到模型部署的全生命周期管理&#xff0c;帮助企业和开…

Mysql系列--0、数据库基础

目录 一、概念 1.1什么是数据库 1.2什么是mysql 1.3登录mysql 1.4主流数据库 二、Mysql与数据库 三、Mysql架构 四、SQL分类 五、存储引擎 5.1概念 5.2查看引擎 5.3存储引擎对比 一、概念 1.1什么是数据库 由于文件保存数据存在文件的安全性问题 文件不利于数据查询和管理…

深度学习和神经网络的介绍

一.前言本期不涉及任何代码&#xff0c;本专栏刚开始和大家介绍了一下机器学习&#xff0c;而本期就是大家介绍一下深度学习还有神经网络&#xff0c;作为一个了解就好。二.深度学习2.1 什么是深度学习&#xff1f;在介绍深度学习之前&#xff0c;我们先看下⼈⼯智能&#xff0…

AI驱动的软件工程(下):AI辅助的质检与交付

&#x1f4da; 系列文章导航 AI驱动的软件工程&#xff08;上&#xff09;&#xff1a;人机协同的设计与建模 AI驱动的软件工程&#xff08;中&#xff09;&#xff1a;文档驱动的编码与执行 AI驱动的软件工程&#xff08;下&#xff09;&#xff1a;AI辅助的质检与交付 大家好…

【WRFDA实操第一期】服务器中安装 WRFPLUS 和 WRFDA

目录在服务器上下载并解压 WRF v4.6.1编译 WRFDA 及相关库安装和配置所需库安装 WRFPLUS 和 WRFDA 以运行 4DVAR 数据同化一、安装 WRFPLUS&#xff08;适用于 WRF v4.0 及以上版本&#xff09;二、安装 WRFDA&#xff08;用于 4DVAR&#xff09;WRFDA 和 WRFPLUS 的安装说明另…

【机器学习【6】】数据理解:数据导入、数据审查与数据可视化方法论

文章目录一、机器学习数据导入1、 Pandas&#xff1a;机器学习数据导入的最佳选择2、与其他方法的差异二、机器学习数据理解的系统化方法论1、数据审查方法论&#xff1a;六维数据画像技术维度1&#xff1a;数据结构审查维度2&#xff1a;数据质量检查维度3&#xff1a;目标变量…

AI炼丹日志-30-新发布【1T 万亿】参数量大模型!Kimi‑K2开源大模型解读与实践

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私…

如何关闭Elasticsearch的安全认证的解决方法

在Elasticsearch 中&#xff0c;启动之后&#xff0c;需要输入用户名和密码&#xff0c;才可以访问&#xff0c;在测试环境中&#xff0c;很不方便&#xff0c;本章教程&#xff0c;主要介绍如何关闭Elasticsearch 的安全认证。在 Elasticsearch 8.x / 9.x 中&#xff0c;默认是…

day051-ansible循环、判断与jinja2模板

文章目录0. 老男孩思想-男女性需求差异1. 手动指定客户机密码2. 批量更新主机名2.1 hostname模块2.2 添加主机清单变量2.3 编写批量修改主机名剧本2.4 修改hosts文件2.5 分发hosts文件剧本3. ansible的并行进程数4. 分组设置主机密码-主机清单分组变量5. 案例&#xff1a;ansib…

大模型安全建设:破误区、识风险、筑防线20250714

&#x1f510; 大模型安全建设&#xff1a;破误区、识风险、筑防线作者&#xff1a;Narutolxy&#xff5c;编辑时间&#xff1a;2025年7月在负责公司 AI 产品落地的过程中&#xff0c;一度以为只要选用主流开源大模型&#xff0c;前面加一层“敏感词提示词过滤”&#xff0c;就…

fastadmin中ajax弹窗修改文字为英文

需要把上图的中文改为 切换语言自动切换成英文找到这个文件public/assets/js/backend.js找到如下图部分 // //点击包含.btn-ajax的元素时发送Ajax请求 原页面// $(document).on(click, .btn-ajax,.ajaxit, function (e) {// var that this;// var options $.exte…

大型语言模型(LLM)的技术面试题

大型语言模型(LLM)的技术面试题 目录 大型语言模型(LLM)的技术面试题 一、提示校准:减轻提示学习中的偏见 二、矢量存储的适用场景 三、模型与人类价值观对齐的技术 四、RLHF中的Reward Hacking 五、微调效果的关键影响因素:预训练模型架构与大小 六、Transformer自注意力…

数字IC后端培训教程之数字IC后端项目典型问题解析

今天给大家分享下最近几个典型的数字后端项目案例&#xff0c;希望对大家的学习和工作有所帮助。 数字IC后端培训教程之数字后端项目典型项目案例解析 Q1:星主&#xff0c;有啥办法可以看到refinePlace或者ecoPlace都动到了那些inst吗&#xff0c;log里只会有mean和max move&…

网络(数据库1)

常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:0racle、DB2 中型:MySq1、sQLServer 小型:Sqlite 2.非关系型数据库以键值对存储,且结构不固定。//JSON Redis MongoDB数据存储&#xff1a;变量、数组、链表 内存 &…

6.删除-demo

在连接数据库的基础上deleteResult, err : db.Exec("DELETE FROM user0 WHERE id ?", 1)package main//删除-demoimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""log" )func main() {db, err : sql.Open…

人机协作系列(四)AI编程的下一个范式革命——看Factory AI如何重构软件工程?

最近这段时间&#xff0c;我发现一个很有意思的现象&#xff1a;那些曾经对 AI 编程工具持怀疑态度的技术领袖们&#xff0c;态度正在集体转变。就像 Flask 的作者 Armin Ronacher&#xff0c;他之前还说 “不敢授权 AI”&#xff0c;现在却坦言 “愿意将工程主导权交给编程代理…

在javaScript里删除节点以及添加节点

1.在javaScript里删除节点在学习中我们只学到了一种删除DOM节点的方法那就是通过元素的父元素来删除该元素&#xff0c;但后面我查阅资料发现删除节点还有其他方法。1.使用 removeChild() 方法&#xff08;最常用&#xff09;我们需要获得元素的父元素&#xff0c;如果不知道可…