【QT】多元素控件

news2024/11/16 16:01:13

多元素控件

  • 多元素控件
    • 1. List Widget
    • 2. Table Widget
    • 3. Tree Widget

多元素控件

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 中添加数据了.

1. List Widget

使用 QListWidget 能够显示⼀个纵向的列表. 形如:

在这里插入图片描述

核心属性:

在这里插入图片描述

核心方法:

在这里插入图片描述

核心信号:

在这里插入图片描述

在上述介绍中,涉及到⼀个关键的类,QListWidgetItem,这个类表⽰ QListWidget 中的⼀个元素,核心方法如下, 本质上就是⼀个 “⽂本+图标” 构成的。

在这里插入图片描述

代码示例:使用 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;这⾥需要给 widget.h 前⾯加上 #include < QListWidgetItem >

			void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
			{
			    if(current && previous){
			        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);
			}

2. Table Widget

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

QTableWidget 核心方法:

在这里插入图片描述

在这里插入图片描述

QTableWidgetItem 核心信号:

在这里插入图片描述

QTableWidgetItem 核心方法:

在这里插入图片描述

代码示例:使用 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("22"));
			}

在这里插入图片描述

3)编写按钮的 slot 函数

			void Widget::on_pushButton_addRow_clicked()
			{
			    // 获取到行数
			    int row = ui->tableWidget->rowCount();
			    // 插入新行
			    ui->tableWidget->insertRow(row);
			}
			
			void Widget::on_pushButton_delRow_clicked()
			{
			    // 获取到选中行
			    int row = ui->tableWidget->currentRow();
			    // 删除行
			    ui->tableWidget->removeRow(row);
			}
			
			
			
			void Widget::on_pushButton_addCol_clicked()
			{
			    // 获取到列数
			    int col = ui->tableWidget->columnCount();
			    // 插入新列
			    ui->tableWidget->insertColumn(col);
			    // 设置列名
			    const QString& name = ui->lineEdit->text();
			    ui->tableWidget->setHorizontalHeaderItem(col, new QTableWidgetItem(name));
			}
			
			void Widget::on_pushButton_delCol_clicked()
			{
			    // 获取到选中列
			    int col = ui->tableWidget->currentColumn();
			    // 删除
			    ui->tableWidget->removeColumn(col);
			}

默认情况下,单元格中的内容直接就是可编辑的。如果不想让⽤⼾编辑, 可以设置

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

3. Tree Widget

使⽤ QTreeWidget 表⽰⼀个树形控件。里面的每个元素, 都是⼀个 QTreeWidgetItem , 每个 QTreeWidgetItem 可以包含多个⽂本和图标, 每个⽂本/图标为⼀个 列.

可以给 QTreeWidget 设置顶层节点(顶层节点可以有多个), 然后再给顶层节点添加⼦节点, 从而构成树形结构.

QTreeWidget 核心方法:

在这里插入图片描述

QTreeWidget 核心信号:

在这里插入图片描述

QTreeWidgetItem 核心属性:

在这里插入图片描述

QTreeWidgetItem 核心方法:

在这里插入图片描述

代码示例:使用 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);
			    }
			}

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

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

相关文章

WPS提示打印机异常,但是任然可以打印

故障现象 使用WPS在打印预览页时&#xff0c;打印机有小橙点提示&#xff0c;点击打印时会报错&#xff0c;提示&#xff1a; 打印机异常&#xff0c;打印机状态出现异常&#xff0c;请检查打印机是否开机并且联机 但是点击确定后&#xff0c;可以继续打印&#xff0c;而且其他…

企业微信hook接口协议,聊天标签中的联系人变动通知

聊天标签中的联系人变动通知 返回示例 {"send_time":1699256104,"flag":0,"receiver":0,"sender":10014,"referid":0,"sender_name":"","app_info":"0FUGGXUfQ0G7nPh","rea…

收藏!2024年程序员的实用神器_new relic idea

前言 Chat GPT的升级节奏让人们越来越惊讶的同时&#xff0c;也让大家感觉到了压力&#xff0c;在如此快节奏的互联网世界中&#xff0c;开发人员需要不断学习与更新知识&#xff0c;保持领先地位并高效地交付高质量软件。 无论是集成开发环境 (IDE)、版本控制系统、测试工具…

“除了C盘都不见了“:现象解析、恢复策略与预防之道

现象概述&#xff1a;非系统盘突然消失之谜 在日常的计算机使用中&#xff0c;不少用户可能遭遇过一个令人措手不及的问题——“除了C盘都不见了”。这一现象发生时&#xff0c;用户惊讶地发现除了作为系统盘的C盘外&#xff0c;原本存放着各类文档、图片、视频等个人资料的D盘…

得帆荣获中国信通院低代码标准参编专家认证和低代码白皮书参编单位认可

2024年6月26日&#xff0c;由中国通信标准化协会主办&#xff0c;中国通信标准化协会云计算标准和开源推进委员会承办的2024低代码无代码产业大会在北京召开&#xff0c;大会以“智融低无码&#xff0c;模创新未来”为主题&#xff0c;发布领域研究成果&#xff0c;交流行业前沿…

使用dd命令简单测试磁盘I/O

本文所有测试使用的均是Oracle公有云OCI上的计算实例的启动盘。 第1轮测试使用的是默认的启动盘参数。第2轮测试使用的是自动调整的启动盘参数&#xff08;如下图&#xff09;&#xff0c;性能更高。 第1轮测试 顺序I/O 运行以下命令5次&#xff0c;dsync表示不使用cache&…

【MySQL05】【 undo 日志】

文章目录 一、前言二、undo 日志&#xff08;回滚日志&#xff09;1. 事务 id2. undo 日志格式2.1 INSERT 对应的 undo 日志2.2 DELETE 对应的 undo 日志2.3 UPDATE 对应的 undo 日志2.3.1 不更新主键2.3.2 更新主键 2.3 增删改操作对二级索引的影响2.4 roll_pointer 3. FIL_PA…

合合信息大模型“加速器”重磅上线

大模型技术的发展和应用&#xff0c;预示着更加智能化、个性化未来的到来。如果将大模型比喻为正在疾驰的科技列车&#xff0c;语料便是珍贵的“燃料”。本次世界人工智能大会期间&#xff0c;合合信息为大模型打造的“加速器”解决方案备受关注。 在大模型训练的上游阶段&…

FPGA问题

fpga 问题 第一道坎&#xff0c;安装软件&#xff1b;没有注册&#xff0c;无法产生sop文件&#xff0c;无法下载 没有相应的库的quartus ii版本&#xff0c;需要另下载 第二道坎&#xff0c;模拟器的下载&#xff0c;安装&#xff1b; 第三道&#xff0c;verilog 语法&#x…

PLM设计协同、PLM在产品开发初期的优化作用

在当今快速变化的市场环境中&#xff0c;产品的成功不再仅仅依赖于其最终的功能与性能&#xff0c;更在于其从概念到市场的整个生命周期的效率和效果。产品生命周期管理&#xff08;Product Lifecycle Management, PLM&#xff09;作为一种集成了数据、流程和工具的综合方法&am…

破局 AI 2.0 时代:利用 AI 提升自我核心竞争力

文章目录 破局 AI 2.0 时代&#xff1a;利用 AI 提升自我核心竞争力1. AI 2.0 时代1.1 特点1.2 发展1.3 影响 2. AI 2.0 时代的机遇 & 挑战2.1 AI 对行业市场的冲击2.2 挑战变为机遇2.3 不同场景下的 AI 效能提升2.3.1 自动化办公任务2.3.2 提升学习效率2.3.3 创意生成与内…

微信小程序的餐厅点餐系统-计算机毕业设计源码71834

摘要 随着移动互联网技术的迅猛发展&#xff0c;微信小程序因其便捷性和即用即走的特性&#xff0c;成为了连接用户与服务的新桥梁。Node.js作为一种高效、轻量级的后端技术&#xff0c;为开发者提供了快速构建服务器端应用的能力。本文介绍了一个基于微信小程序和Node.js的餐厅…

【小贪】程序员必备:Shell、Git、Vim常用命令

近期致力于总结科研或者工作中用到的主要技术栈&#xff0c;从技术原理到常用语法&#xff0c;这次查缺补漏当作我的小百科。主要技术包括&#xff1a; ✅数据库常用&#xff1a;MySQL, Hive SQL, Spark SQL✅大数据处理常用&#xff1a;Pyspark, Pandas⚪ 图像处理常用&#…

【嵌入式单片机】之RS-232、RS-485、RS-422比较

1. RS422是什么 RS422,正式名称为TIA/EIA-422,是一种串行通信标准,专为实现长距离、高可靠性的数据传输而设计。它采用差分信号传输技术,通过两对双绞线实现全双工通信,即发送和接收可以同时进行。RS422在工业自动化和远程监控系统中曾经扮演着重要角色,以其出色的抗干扰…

新衣服不香了!欧洲人越来越喜欢二手时尚品,国外有哪些二手交易平台?

在欧美国家&#xff0c;大家都很热衷于购买二手商品。过去网店不太盛行的时候&#xff0c;买衣服最喜欢逛二手店。现如今&#xff0c;随着经济和环保观念的普及&#xff0c;也有了二手交易平台&#xff0c;大家的热情也从线下转到了线上。 新衣服不香了&#xff01;欧洲人越来越…

深入分析 Android BroadcastReceiver (十)(完)

文章目录 深入分析 Android BroadcastReceiver (十)1. 深入理解 Android 广播机制的高级应用与实践1.1 高级应用1.1.1 示例&#xff1a;广播启动服务1.1.2 示例&#xff1a;数据变化通知1.1.3 示例&#xff1a;下载完成通知 1.2 实践建议1.2.1 设置权限1.2.2 动态注册和注销广播…

系统架构设计师——计算机体系结构

分值占比3-4分 计算机硬件组成 计算机硬件组成主要包括主机、存储器和输入/输出设备。 主机&#xff1a;主机是计算机的核心部分&#xff0c;包括运算器、控制器、主存等组件。运算器负责执行算术和逻辑运算&#xff1b;控制器负责协调和控制计算机的各个部件&#xff1b;主存…

Qt | QPen 类(画笔)

01、画笔基础 1、需要使用到的 QPainter 类中的函数原型如下: void setPen(const QPen &pen); //设置画笔,void setPen(const QColor &color); //设置画笔,该笔样式为 Qt::SolidLine、宽度为 1,颜色由 color 指定void setPen(Qt::PenStyle style); //设置画笔,该…

资源分享—2021版三调符号库

汇总整理平台软件支持过程中客户项目提供的各类资源&#xff08;包括但不限于符号库、地图模板等&#xff09;&#xff0c;在客户允许情况下进行集团内分享。 本次分享新版国土空间规划【三调符号库&#xff08;2021版&#xff09;】&#xff0c;提供SuperMap格式符号库下载。 …

innovus:通过dbGet获取指定边上的port

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 相关文章链接&#xff1a; dbGet快速学习教程 常用dbGet命令 #$edge代表指定边"0 1 2 3 ..."&#xff0c;以矩形为例&#xff0c;原点在左下角&#xff0c;0就代表…