【Qt常用控件】—— 多元素控件

目录

1.1 List Widget  

1.2 Table Widget  

1.3 Tree Widget

1.4 小结


Qt 中提供的多元素控件有:

  • QListWidget
  • QListView
  • QTableWidget
  • QTableView
  • QTreeWidget
  • QTreeView

xxWidget 和 xxView 之间的区别
以 QTableWidget 和 QTableView 为例:
  1. QTableView 是基于 MVC 设计的控件. QTableView ⾃⾝不持有数据. 使⽤ QTableView的时候需要⽤⼾创建⼀个 Model 对象 (⽐如 QStandardModel ), 并且把 Model 和QTableView 关联起来. 后续修改 Model 中的数据就会影响 QTableView 的显⽰; 修改QTableView 的显⽰也会影响到 Model 中的数据(双向绑定).
  2. QTableWidget 则是 QTableView 的子类, 对 Model 进⾏了封装. 不需要⽤⼾⼿动创建Model 对象, 直接就可以往 QTableWidget 中添加数据了.

1.1 List Widget  

在Qt中,QListWidget是一个用于显示列表项的常用控件,它提供了一种简单的方法来显示文本和图标的列表。

  • 每个选项都可以被选中.  

核心属性  

属性
说明
currentRow
当前被选中的是第⼏⾏
count
⼀共有多少⾏
sortingEnabled
是否允许排序
isWrapping
是否允许换⾏
itemAlignment
元素的对⻬⽅式
selectRectVisible
被选中的元素矩形是否可⻅
spacing
元素之间的间隔
核心方法
⽅法
说明
addItem(const QString& label)
addItem(QListWidgetItem * item)
列表中添加元素.
currentItem()
返回 QListWidgetItem* 表⽰当前选中的元素
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
设置⽂本对⻬⽅式.
代码⽰例: 使⽤ ListWidget
1) 在界⾯上创建⼀个 ListView , 右键 => 变形为 => ListWidget , 再创建⼀个 lineEdit 和 两个按 钮.
  •  注意: ListWidget ListView 的⼦类, 功能⽐ ListView 更丰富. 咱们使⽤ListWidget 即可

 2) 编写 widget.cpp, 在构造函数中添加初始元素

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");
}
3) 编写 listWidget 的 slot 函数
  • 此处需要判定 current previous ⾮空. 初始情况下是没有元素选中的, 就导致这俩指针可能是 NULL.
void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current,
QListWidgetItem *previous)
{if (current != NULL && previous != NULL) {qDebug() << "当前选中: " << current->text()<< "之前选中: " << previous->text();}
}
  • 这⾥需要给 widget.h 前⾯加上 #include <QListWidgetItem>

4) 编写按钮的 slot 函数 

void Widget::on_pushButton_clicked()
{// 获取到输⼊框的内容const QString& text = ui->lineEdit->text();if (text.isEmpty()) {return;}ui->listWidget->addItem(text);
}void Widget::on_pushButton_2_clicked()
{// 获取当前被选中的元素int row = ui->listWidget->currentRow();// 删除这⼀⾏ui->listWidget->takeItem(row);
}
5) 执⾏程序, 观察效果. 可以新增元素, 选中元素, 删除元素.


1.2 Table Widget  

使⽤ QTableWidget 表⽰⼀个表格控件. ⼀个表格中包含若⼲⾏, 每⼀⾏⼜包含若⼲列. 表格中的每个单元格, 是⼀个 QTableWidgetItem 对象.

QTableWidget 核心方法

⽅法
说明
item(int row, int column)
根据⾏数列数获取指定的 QTableWidgetItem*
setItem(int row, int column,
QTableWidget*)
根据⾏数列数设置表格中的元素
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(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 QString&)
设置⽂本
setTextAlignment(int)
设置⽂本对⻬
setIcon(const QIcon&)
设置图标
setSelected(bool)
设置被选中
setSizeHints(const QSize&)
设置尺⼨
setFont(const QFont&)
设置字体
代码示例: 使⽤ QTableWidget

 1) 在界面上创建 QTableWidget 和 三个按钮, ⼀个输⼊框

  • 注意: QTableWidget QTableView 的⼦类, 功能⽐ QTableView 更丰富. 咱们使用QTableWidget 即可.

2) 编写 widget.cpp 构造函数, 构造表格中的初始数据. 

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建 3 ⾏ui->tableWidget->insertRow(0);ui->tableWidget->insertRow(1);ui->tableWidget->insertRow(2);// 创建 3 列ui->tableWidget->insertColumn(0);ui->tableWidget->insertColumn(1);ui->tableWidget->insertColumn(2);// 给 3 列设定列名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"));
}
3) 编写按钮的 slot 函数
void Widget::on_pushButton_addRow_clicked()
{// 1. 获取到⾏数int rowCount = ui->tableWidget->rowCount();// 2. 插⼊新⾏ui->tableWidget->insertRow(rowCount);
}void Widget::on_pushButton_delRow_clicked()
{// 1. 获取选中的⾏号int curRow = ui->tableWidget->currentRow();// 2. 删除对应⾏ui->tableWidget->removeRow(curRow);
}void Widget::on_pushButton_addCol_clicked()
{// 1. 获取到列数int colCount = ui->tableWidget->columnCount();// 2. 插⼊新列ui->tableWidget->insertColumn(colCount);// 3. 设置列名const QString& name = ui->lineEdit->text();ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(name));
}void Widget::on_pushButton_delCol_clicked()
{// 1. 获取选中的列号int curCol = ui->tableWidget->currentColumn();// 2. 删除对应的列ui->tableWidget->removeColumn(curCol);
}

4) 执行程序, 即可完成表格的基本操作.

  1. 默认情况下, 单元格中的内容直接就是可编辑的.
  2. 如果不想让用户进行编辑,可以设置
  • ui>tableWidget>setEditTriggers(QAbstractItemView::NoEditTriggers);

1.3 Tree Widget

  1. 使⽤ QTreeWidget 表⽰⼀个树形控件. ⾥⾯的每个元素, 都是⼀个 QTreeWidgetItem , 每个 QTreeWidgetItem 可以包含多个⽂本和图标, 每个⽂本/图标为⼀个列.
  2. 可以给 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(const QString& text)
设置 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
持有的⽂本
textAlignment
⽂本对⻬⽅式
icon
持有的图表
font
⽂本字体
hidden
是否隐藏
disabled
是否禁⽤
expand
是否展开
sizeHint
尺⼨⼤⼩
selected
是否选中

QTreeWidgetItem 方法 

⽅法
说明
addChild(QTreeWidgetItem* child)
新增⼦节点
childCount()
⼦节点的个数
child(int index)
获取指定下标的⼦节点. 返回 QTreeWidgetItem*
takeChild(int index)
删除对应下标的⼦节点
removeChild(QTreeWidgetItem*
child)
删除对应的⼦节点
parent()
获取该元素的⽗节点
代码示例: 使⽤ QTreeWidget
1) 在界⾯上创建⼀个 TreeView , 右键 => 变形为 => TreeWidget , 再创建⼀个 lineEdit 和两个按 钮.
  • 注意: TreeWidget TreeView 的⼦类, 功能⽐ TreeView 更丰富. 咱们使⽤ TreeWidget即可.

 2) 编写代码, 构造初始数据

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);
}
3) 编写代码, 实现按钮的 slot 函数
void Widget::on_pushButton_clicked()
{// 获取输⼊框内容const QString& text = ui->lineEdit->text();if (text.isEmpty()) {return;}// 添加到顶层节点中QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(0, text);ui->treeWidget->addTopLevelItem(item);
}void Widget::on_pushButton_2_clicked()
{// 获取输⼊框内容const QString& text = ui->lineEdit->text();if (text.isEmpty()) {return;}// 获取到当前选中的节点QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();if (currentItem == NULL) {return;}// 构造新的 itemQTreeWidgetItem* newItem = new QTreeWidgetItem();newItem->setText(0, text);// 添加 item 到选中节点currentItem->addChild(newItem);// 展开⽗节点currentItem->setExpanded(true);
}void Widget::on_pushButton_3_clicked()
{// 获取到当前选中的节点QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();if (currentItem == NULL) {return;}// 获取当前节点的⽗节点QTreeWidgetItem* parent = currentItem->parent();if (parent == NULL) {// 顶层节点int index = ui->treeWidget->indexOfTopLevelItem(currentItem);ui->treeWidget->takeTopLevelItem(index);} else {// ⾮顶层节点parent->removeChild(currentItem);}
}

4) 执⾏程序, 可以针对树形框进⾏编辑.


1.4 小结

QListWidgetQTableWidgetQTreeWidget 是 Qt 中常用的三种用于展示列表、表格和树形结构数据的控件,它们各自有着不同的特点和用法。

QListWidget

  • 特点:用于显示简单的列表,每个列表项可以包含文本、图标等简单内容。
  • 用途:适用于简单的列表展示,如文件列表、选项列表等。

QTableWidget

  • 特点:用于显示二维表格数据,支持行列操作、单元格编辑等功能。
  • 用途:适用于显示表格数据,如数据展示、编辑表格等。

QTreeWidget

  • 特点:用于显示树形结构数据,支持展开折叠、节点操作等功能。
  • 用途:适用于显示层级结构数据,如文件夹结构、树状菜单等。

总结

  • 使用 QListWidget 来显示简单的列表数据。
  • 使用 QTableWidget 来显示二维表格数据。
  • 使用 QTreeWidget 来显示树形结构数据。

这些控件都提供了丰富的功能和灵活的接口,可以根据实际需求选择合适的控件来展示数据。

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

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

相关文章

Oracle中rman使用记录

最近在项目中&#xff0c;遇到使用RMAN的操作来恢复数据库中某个时间归档日志&#xff0c;RMAN的原理和理解&#xff0c;网友们百度了解一下。我重点将实操部分了。直接上实验环节&#xff0c;让网友更懂。&#xff08;特别提醒&#xff1a;我是1:1用VMware克隆数据库进行RMAN还…

Mockito

小王学习录 依赖注解MockSpy静态方法单元测试InjectMocks 注解Captor 注解BeforeAll 和 BeforeEach的区别ParameterizedTestValueSourceEnumSourceCsvSourceMethodSource 打桩打桩方式打桩参数匹配方式 依赖 <!-- https://mvnrepository.com/artifact/org.mockito/mockito-i…

Armpro脱壳软件搭建教程附源代码

PHP8.0版本&#xff0c;数据库8.0版本 1.配置注册机文件&#xff0c;打开将arm.zip/res目录下&#xff0c;mt管理器搜索将其全部修改为你自己的域名或者是服务器IP 2.然后建立数据库 数据库账号arm 数据库用户名arm 数据库密码EsZfXY4tD3h2NNA4 3.导入数据库 4.配置Redi…

03-JAVA设计模式-备忘录模式

备忘录模式 什么是备忘录模式 Java中的备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在不破坏封装性的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便以后可以将对象恢复到原先保存的状态…

配置有效的防爬虫技术保护网站

本文主要介绍了防爬虫的概念、目的以及一些有效的防爬虫手段。防爬虫是指网站采取各种技术手段阻止爬虫程序对其数据进行抓取的过程。为了保护网站的数据和内容的安全性&#xff0c;防止经济损失和恶意竞争&#xff0c;以及减轻服务器负载&#xff0c;网站需要采取防爬虫机制。…

统一所有 LLM API:支持预算与速率限制 | 开源日报 No.229

BerriAI/litellm Stars: 6.7k License: NOASSERTION litellm 是一个使用 OpenAI 格式调用所有 LLM API 的工具。它支持 Bedrock、Azure、OpenAI、Cohere、Anthropic 等 100 多种 LLMs&#xff0c;提供企业级代理服务器和稳定版本 v1.30.2。 主要功能和优势包括&#xff1a; 将…

探索大型语言模型(LLM)在人类性格个性评估(MBTI)中的前景与应用

1.概述 大型语言模型&#xff08;LLM&#xff09;如ChatGPT在各个领域的应用确实越来越广泛&#xff0c;它们利用庞大的数据集进行训练&#xff0c;以模拟人类的语言理解和生成能力。这些模型在提供信息、解答问题、辅助决策等方面表现出了强大的能力&#xff0c;但它们并不具…

[集群聊天项目] muduo网络库

目录 网络服务器编程常用模型什么是muduo网络库什么是epoll muduo网络库服务器编程 网络服务器编程常用模型 【方案1】 &#xff1a; accept read/write 不是并发服务器 【方案2】 &#xff1a; accept fork - process-pre-connection 适合并发连接数不大&#xff0c;计算任…

Yolov5 export.py实现onnx模型的导出

查了很多资料&#xff0c;很多用python代码写的&#xff0c;只需要这个库那个库的&#xff0c;最后都没成功。 不如直接使用Yolov5里面的 export.py实现模型的转换。 一&#xff1a;安装依赖 因为yolov5里面的requirments.txt是将这些转换模型的都注释掉了 所以需要解除注释…

人工智能论文GPT-3(2):2020.5 Language Models are Few-Shot Learners;微调;少样本Few-Shot (FS)

2 方法Approach 我们的基本预训练方法&#xff0c;包括模型、数据和训练&#xff0c;与GPT-2中描述的过程相似&#xff0c;只是模型规模、数据集规模和多样性&#xff0c;以及训练时长有所扩大&#xff0c;相对简单直接。 我们使用的上下文学习也与GPT-2相似&#xff0c;但在…

Kafka 3.x.x 入门到精通(03)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通&#xff08;03&#xff09;——对标尚硅谷Kafka教程 2. Kafka基础2.1 集群部署2.2 集群启动2.3 创建主题2.4 生产消息2.4.1 生产消息的基本步骤2.4.2 生产消息的基本代码2.4.3 发送消息2.4.3.1 拦截器2.4.3.1.1 增加拦截器类2.4.3.1.2 配置拦截器 2.4.3…

.NET 邮件发送 SMTP邮件发送

SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;是用于电子邮件传输的规则集&#xff0c;可以从邮件客户端向接收电子邮件服务器发送、中继或转发邮件。发件人可使用SMTP 服务器来执行发送电子邮件的过程。SMTP服务器则是按照这些规则中转电子邮件的服务器。 IMAP…

【Qt QML】TabBar的用法

Qt Quick中的TabBar提供了一个基于选项卡的导航模型。TabBar由TabButton控件填充&#xff0c;并且可以与任何提供currentIndex属性的布局或容器控件一起使用&#xff0c;例如StackLayout或SwipeView。 import QtQuick import QtQuick.Controls import QtQuick.LayoutsWindow …

企业微信hook接口协议,ipad协议http,发送大视频文件

发送大视频文件 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人或群idisRoom是bool是否是群消息 请求示例 {"uuid":"1688853790xxx", //uuid 默认随机生成如果初始化传了id则用初始…

潜藏10年的恶意软件被发现;利用漏洞在K8S上挖矿;AWS、Google和Azure 出现信息泄露危机 | 安全周报0419

关键词&#xff1a;OfflRouter、恶意软件、VBA宏病毒、机密文件、可执行文件、iOS间谍软件、LightSpy、F_Warehouse、Azure CLI、AWS CLI、Google Cloud CLI 1. 近十年来&#xff0c;OfflRouter恶意软件在乌克兰一直未被发现 自2015年以来&#xff0c;部分乌克兰政府网络一直…

【学习】如何高效地进行集成测试

在软件开发的过程中&#xff0c;测试环节至关重要。而在这其中&#xff0c;集成测试更是保证软件质量的关键步骤之一。本文将探讨如何高效地进行集成测试&#xff0c;以确保软件的稳定性和可靠性。 一、什么是集成测试 集成测试是指在单元测试的基础上&#xff0c;将模块按照设…

力扣刷题学习(跟随视频学着刷)

使用入门 视频链接 【手把手带你刷Leetcode力扣&#xff5c;各个击破数据结构和算法&#xff5c;大厂面试必备技能【已完结】-哔哩哔哩】 https://b23.tv/vIcRT61 时空复杂度 时间&#xff1a; 空间&#xff1a;主要有O(1)和O(n)两种&#xff0c;只用计算开辟的内存&#xff…

cdp集群Hbase组件HRegionServer服务停止原因以及排查

前言&#xff1a;重启集群后某一节点HRegionServer服务停止&#xff0c;重启前所有服务均正常 去查看日志&#xff1a; 日志报错 ERROR HRegionServer Master rejected startup because clock is out of sync org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.h…

【Python】异常、模块与包

目录 捕获异常 异常的传递 Python中的模块 模块的导入方式 as定义别名 自定义模块 Python包 第三方包 综合案例 当我们的程序遇到了BUG, 那么接下来有两种情况: ① 整个程序因为一个BUG停止运行 ② 对BUG进行提醒, 整个程序继续运行 但是在真实工作中, 我们肯定不能…

第十五届蓝桥杯省赛第二场C/C++B组D题【前缀总分】题解(AC)

暴力解法 O ( 26 n 5 ) O(26n^5) O(26n5) 枚举将第 i i i 个字符串的第 j j j 个字符改为 c c c 的所有方案&#xff0c;时间复杂度 O ( 26 n 2 ) O(26n^2) O(26n2)&#xff0c;修改并计算总分&#xff0c; O ( n 3 ) O(n^3) O(n3)。 暴力优化 O ( 26 n 3 log ⁡ n ) O…