Qt 多元素控件

Qt开发 多元素控件

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

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

xxWidget 和 xxView 之间的区别

以 QTableWidget 和 QTableView 为例.

  • QTableView 是基于 MVC 设计的控件. QTableView 自身不持有数据. 使用QTableView 的 时候需要用户创建⼀个 Model 对象 (比如 QStandardModel ), 并且把 Model 和 QTableView 关联起来. 后续修改 Model 中的数据就会影响 QTableView 的显示; 修改 QTableView 的显示也会影响到 Model 中的数据(双向绑定).
  • QTableWidget 则是 QTableView 的子类, 对 Model 进行了封装. 不需要用户手动创建 Model 对象, 直接就可以往 QTableWidget 中添加数据了.

List Widget

使用 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 非空. 初始情况下是没有元素选中的, 就导致这俩指针可能是 nullptr.

void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current,
QListWidgetItem *previous)
{
	if (current != NULL && previous != NULL) {
		qDebug() << "当前选中: " << current->text() << "之前选中: " << previous->text();
	}
}

(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) 执行程序,观察效果.可以新增元素,选中元素,删除元素

在这里插入图片描述

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 和 三个按钮, 一个输入框

在这里插入图片描述

(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, newQTableWidgetItem(name));
}

void Widget::on_pushButton_delCol_clicked()
{
	// 1. 获取选中的列号
	int curCol = ui->tableWidget->currentColumn();
	// 2. 删除对应的列
	ui->tableWidget->removeColumn(curCol);
}

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

在这里插入图片描述

默认情况下, 单元格中的内容直接就是可编辑的.

如果不想让用户编辑, 可以设置 ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

Tree Widget

使用 QTreeWidget 表示一个树形控件,里面的每个元素,都是一个 TreeWidgetItem,每个 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(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 和两个按钮

在这里插入图片描述

(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) 执行程序, 可以针对树形框进行编辑.

在这里插入图片描述

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

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

相关文章

latex如何让标题section取消数字标号

解决方法——加一个*号 在LaTeX中&#xff0c;如果你想让section标题取消数字标号&#xff0c;可以使用section*代替section。section*将生成一个不带数字标号的节标题。 例如&#xff0c;你可以这样写&#xff1a; \section*{这是不带数字标号的节标题}这将生成一个标题&am…

给老婆整了个短剧搜索机器人APP

最近短剧挺火&#xff0c;很多群友们都在做一些资源分享&#xff0c;老胡于是基于这些资源做了个短剧搜索引擎&#xff0c;挺多朋友喜欢看的&#xff0c;我老婆也在看哈哈&#xff0c;真上头&#xff0c;废话不多说&#xff0c;上短剧机器人。 短剧机器人 直接在微信群输入&…

解决由于历史原因解析tflite失败的问题

文章目录 0. 背景1. tflite 历史遗留问题2. schema3. flatbuffers 编译器3.1 安装 FlatBuffers 编译器3.2. 编译 FlatBuffers schema 文件3.3 使用生成的 Python 文件 4 问题未解决终极解决方案 写在最前面&#xff1a;解决方法是升级tensorflow版本&#xff0c;重新生成tflite…

【go从入门到精通】if else 条件控制

Go 语言条件语句&#xff1a; 在 Go 语言中&#xff0c;条件语句用于根据不同的条件执行不同的代码。Go 语言提供了两种条件语句&#xff1a;if 语句和switch 语句。 if语句 if由一个布尔表达式后紧跟一个或多个语句组成。 语法 Go 编程语言中 if 语句的语法如下&#xff…

反向海淘系统中的数据安全挑战与解决方案探讨

**反向海淘系统中的数据安全挑战与解决方案探讨** **一、背景** 随着反向海淘市场的不断扩大&#xff0c;涉及的数据安全挑战也日益增多。本文旨在探讨反向海淘系统中面临的数据安全挑战&#xff0c;以及相应的解决方案。 **二、数据安全挑战** 1. **数据传输安全**&#x…

微信支付宝--充ChatGPTPLUS/openAI key

ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够基于在预训练阶段所见的模式和统计规律&#xff0c;来生成回答&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写论文、邮件、脚本、文案、翻译、代码等…

【Python】反编译PyInstaller打包的exe

查看exe基本信息 需要反编译的exe 查看exe文件的打包工具&#xff0c;查看exe信息的软件叫Detect It Easy(查壳工具) 由图我们可以看出当前选中的exe文件是由名叫PyInstaller的打包工具打包好的exe 反编译 exe反编译工具&#xff1a;pyinstxtractor.py 使用方法 python py…

面试算法-65-二叉树的层平均值

题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,11.00000] 解释&#xff1a;第 0 层的…

【Spring高级】AOP和动态代理

目录 AspectJ实现AOPJava Agent实现AOPProxy&#xff08;代理&#xff09;模式实现AOPJDK代理CGLIB代理 AOP的底层实现切点Aspect与Advisor切面AOP底层的实现演示 Spring中的代理选择 在Java中&#xff0c;AOP&#xff08;面向切面编程&#xff09;的实现可以通过以下几种方法&…

MySQL的日志:undo log、redo log、binlog有什么作用

目录 从一个update语句说起 undo log 为什么需要undo log undo log 版本链 undo log 是如何持久化到磁盘? redo log 为什么需要redo log redo的组成 redo Log的刷盘策略 redo Log循环写 crash-safe能力 binlog 为什么需要 binlog &#xff1f; binlog与redo lo…

淘宝API接口开发系列——淘宝详情数据采集

淘宝详情数据采集涉及多种技术和方法&#xff0c;下面列举几种常见的方式&#xff1a; 请求示例&#xff0c;API接口接入Anzexi58 爬虫技术&#xff1a;使用编程语言&#xff08;如Python&#xff09;编写网络爬虫程序&#xff0c;通过模拟浏览器行为访问淘宝网站&#xff0c;…

XMind:让思维可视化,提升工作效率的利器

XMind是一款全球领先的开源思维导图和头脑风暴软件&#xff0c;它应用全球最先进的Eclipse RCP软件架构&#xff0c;拥有优秀的用户体验&#xff0c;凭借简单易用、功能强大的特点&#xff0c;在2013年被著名互联网媒体Lifehacker评选为全球最受欢迎的思维导图软件。目前&#…

PyQt上手指南

文章目录 前言PyQt的好处从一个最简单的例子入手PyQt5基础组件体系源码结构 Qt Designer基础布局高级界面Web控件 多线程列表图形绘制PyQt5.QtGuiPyQtGraphmatplotlib和PyQt结合和mplfinance结合 工具使用打包链接 前言 用户界面开发&#xff0c;我搞过visual C MFC、Delphi V…

【链表】Leetcode 142. 环形链表 II【中等】

环形链表 II 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系…

ruoyi-activiti添加用车申请流程(二)

实体类Car中必须要有String userId属性。 设置自定义表单为system/car/deptleadercheck&#xff1a; 然后在CarController中编写system/car/deptleadercheck对应的函数&#xff1a; GetMapping("/deptleadercheck")public String deptleadercheck(String taskid, M…

学习总结!

最近主要学习了java&#xff0c;题目的话就写了两道。 这道题目运用三维的bfs&#xff0c;第一次做时无从下手&#xff0c;原来可以利用三维数组&#xff08;第一次用三维数组&#xff09;可以解决这类问题&#xff0c;然后套bfs模板即可。 #include<iostream> #include…

算法体系-11 第十一节:二叉树基本算法(上)

一 两链表相交 1.1 题目描述 给定两个可能有环也可能无环的单链表&#xff0c;头节点head1和head2。请实现一个函数&#xff0c;如果两个链表相交&#xff0c;请返回相交的 第一个节点。如果不相交&#xff0c;返回null 【要求】 如果两个链表长度之和为N&#xff0c;时间复杂…

瑞_Redis_短信登录_基于Session实现登录流程

文章目录 项目介绍1 短信登录1.1 项目准备1.2 基于Session实现登录流程1.2.1 功能流程介绍1.2.1.1 发送短信验证码1.2.1.2 短信验证码登录、注册1.2.1.3 校验登录状态 1.2.2 实现发送短信验证码功能1.2.2.1 页面流程1.2.2.2 代码实现1.2.2.3 测试 1.2.3 实现短信验证码登录、注…

SLAM 算法综述

LiDAR SLAM 其主要思想是通过两个算法&#xff1a;一个高频激光里程计进行低精度的运动估计&#xff0c;即使用激光雷达做里程计计算两次扫描之间的位姿变换&#xff1b;另一个是执行低频但是高精度的建图与校正里程计&#xff0c;利用多次扫描的结果构建地图&#xff0c;细化位…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月20日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年3月20日 星期三 农历二月十一 春分 1、 教育部发布新增24种本科专业 涉及智能视觉工程、足球运动等。 2、 香港特区立法会全票通过《维护国家安全条例》&#xff0c;将于23日刊宪。 3、 国际乒联更新世界排名&#xff0c…