【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;
     }
     // 构造新的 item
     QTreeWidgetItem* 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 来显示树形结构数据。

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

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

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

相关文章

快速构建Spring boot项目

1、Idea里新建项目 2、创建HelloController 3、运行 4、开发环境热部署 pom.xml 查看目前已有的依赖 配置properties 设置 ctrlshiftalt/ 新版本的compiler.automake.allow.when.app.running已经不在registry里面了&#xff0c;在settings里面的Advanced settings里面Allow au…

【R语言简介】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【LLVM】在Windows中配置LLVM开发环境

本文内容 0.动机1. 安装Visual Studio 20192 安装Python3已安装Python未安装Python 3. 配置Visual Studio4.安装LLVM获取源码将LLVM切换到我们的目标版本编译LLVM 0.动机 想着ubuntu用着别手&#xff0c;看看能不能在Windows中进行开发。于是就动手实践了下 Getting Started w…

Android Studio实现内容丰富的安卓养老平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 158安卓养老 1.开发环境 后端用springboot框架&#xff0c;安卓的用android studio开发android stuido3.6 jak1.8 idea mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登…

Mockaroo - 在线生成测试用例利器

简介&#xff1a;Mockaroo 是一个无需安装的在线工具&#xff0c;用于生成大量的自定义测试数据。它支持多种数据格式&#xff0c;如JSON、CSV、SQL和Excel&#xff0c;并能模拟复杂的数据结构。 历史攻略&#xff1a; 测试用例&#xff1a;多条件下编写&#xff0c;懒人妙用…

How to solve matplotlib Chinese garbled characters in Ubuntu 22.04

conda create -n huizhou python3.8conda activate huizhouconda install numpy matplotlibpip install mplfontsmplfonts init# 导入必要的库 import numpy as np import matplotlib.pyplot as plt# 创建角度数组&#xff0c;从0到2π x np.linspace(0, 2 * np.pi, 100)# 计算…

微信小程序-------模板与配置

能够使用 WXML 模板语法渲染页面结构能够使用 WXSS 样式美化页面结构能够使用 app.json 对小程序进行全局性配置能够使用 page.json 对小程序页面进行个性化配置能够知道如何发起网络数据请求 一.WXML 模板语法 数据绑定 1. 数据绑定的基本原则 ① 在 data 中定义数据 ② 在…

架构师系列-消息中间件(11)- RocketMQ 进阶(5)-深入分析(2)

3. 文件刷盘机制 RocketMQ 的消息是存储在磁盘上的&#xff0c;这样做有两个优点&#xff1a; 保证断电后恢复 让存储的消息量超出内存的限制 RocketMQ 存储与读写是基于 JDK NIO 的内存映射机制&#xff0c;具体使用 MappedByteBuffer&#xff08;基于 MappedByteBuffer 操…

通配符HTTPS安全证书

众多类型的SSL证书&#xff0c;要说适用或者说省钱肯定是通配符了&#xff0c;因为谁都想一本SSL证书包括了整条域名&#xff0c;而且也不用一条一条单独管理。 通配符HTTPS安全证书&#xff0c;其实就是通配符SSL证书&#xff0c;SSL证书主流CA的参数都一样&#xff0c;通配符…

python中如何用matplotlib写雷达图

#代码 import numpy as np # import matplotlib as plt # from matplotlib import pyplot as plt import matplotlib.pyplot as pltplt.rcParams[font.sans-serif].insert(0, SimHei) plt.rcParams[axes.unicode_minus] Falselabels np.array([速度, 力量, 经验, 防守, 发球…

迅雷不限速破解方法

背景&#xff1a;现在迅雷和百度云的下载速度真的太恶心了&#xff0c;所以总有大佬可以采用厉害的方法进行破解&#xff0c;在网上看了一圈&#xff0c;很多都是骗人或者是无效的&#xff0c;找了一个靠谱的方法&#xff0c;亲测速度能达到10M以上&#xff0c;非常给力。 以下…

数据库工程师的工作职责(合集)

数据库工程师的工作职责1 职责&#xff1a; 1. 日常数据库的基本安装&#xff0c;维护&#xff0c;升级&#xff0c;监控的; 2. 配合研发部门进行数据库设计支持&#xff0c;协助开发、设计和进行SQL语言优化; 3. 配合相关部门数据库相关的任务&#xff0c;比如数据导入导出&am…

怎么使用下载视频号视频?详细视频下载使用教程

越来越多的人开始使用视频号等平台来分享和观看视频内容。然而&#xff0c;有时候我们可能会遇到需要将视频保存到本地设备以便离线观看或进一步编辑的情况。 本文将为您详细介绍如何使用视频下载plus&#xff0c;来下载视频号的视频内容。 一、了解视频号下载功能 首先&…

SublimeText - 汉化插件安装教程

第一步&#xff1a;快捷键CTRLShiftp&#xff0c;&#xff08;如果是Mac&#xff0c;则是command Shiftp&#xff09; 弹出查找栏—找到 install Package&#xff0c;并点击选择。 如下图&#xff1a; 第二步&#xff1a;再次弹出的框中&#xff0c;选择 ChineseLocalizations…

飞鹤与满趣健达成战略合作 加速深化国际化布局

继获得加拿大地区首张婴幼儿配方奶粉生产执照后&#xff0c;中国飞鹤的海外征途再添新动作。4月25日&#xff0c;中国飞鹤加拿大皇家妙克与美国婴童用品巨头满趣健&#xff08;Munchkin&#xff09;在北京正式达成战略合作。此次合作彰显了中国乳企的硬核实力&#xff0c;也是飞…

前后缀分离,CF1209 C. Maximal Intersection

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1029C - Codeforces 二、解题报告 1、思路分析 线段相交具有可…

亚马逊风控有哪些?如何在账号风控种避免封号?

如今商业竞争愈发激烈的时代&#xff0c;数据的准确性和可靠性已经成为商家和消费者共同追求的目标。为了达到这一目标&#xff0c;亚马逊采取了一系列风险管控措施&#xff0c;旨在杜绝恶意行为、虚假交易等违规情况&#xff0c;从而确保交易在平台上的安全与诚信。许多亚马逊…

汇隆晶片授权世强硬创,代理产品工作温度范围覆盖工业/车规/航天级

凭借独特的线上线下技术分销以及团队优异的推新能力&#xff0c;世强先进&#xff08;深圳&#xff09;科技股份有限公司&#xff08;下称“世强先进”&#xff09;获得浙江汇隆晶片技术有限公司&#xff08;下称“汇隆晶片”&#xff0c;英文名&#xff1a;HLC&#xff09;授权…

【JAVA】一文掌握Java并发编程

Java 开发中&#xff0c;并发编程属于相当重要的一个知识点&#xff0c;可以说&#xff0c;Java 的并发能力&#xff0c;是成就今日 Java 地位的因素之一。Java 的并发编程由浅入深实质上是包含 Java&#xff08;API&#xff09;层、JVM&#xff08;虚拟机&#xff09;层、内核…

网络攻击近在咫尺:数据加密与SSL成为信息安全之盾

随着互联网的日益普及和科技的迅猛发展&#xff0c;网络攻击已经成为信息安全领域面临的一大难题。近期&#xff0c;一场网络安全实验让我们对网络攻击有了更为深刻的认识。在实验中&#xff0c;网络安全工程师通过模拟攻击&#xff0c;展示了木马植入、文件浏览、键盘监听、病…