[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget

目录

1.多元素控件介绍 

2.ListWidget控件

属性

核心方法

核心信号

细节

Demo:编辑日程

3.TableWidget控件 

核心方法

QTableWidgetItem核心信号

QTableWidgetItem核心方法

细节

Demo:编辑学生信息

4.TreeWidget控件 

核心方法

核心信号

QTreeWidgetItem核心方法

细节

控件使用案例


1.多元素控件介绍 

        Qt中为我们提供的多元素控件有QListWidget、QListView、QTableWidget、QTableView、QTreeWidget、QTreeView六个。那么我可以发现,他们是两两一组,xxxWidget和xxxView两种形式,那么他俩之间有什么区别呢?

        xxxView是更底层的实现,xxxWidget是基于xxxView封装而来的,用户使用起来比较容易。此处的xxxView是MVC结构的实现,MVC是软件开发中非常经典的软件结构组织形式。

M:model数据   V:view视图(界面) C:controller控制器,数据和视图之间的业务流程。

        对于xxxView来说只是负责了上述的视图,不负责数据如何表示,以及数据和视图之间如何交互,如果用户使用xxxView的话,就需要自己创建model对象,和视图关联起来。而QxxxWidget则是QxxxView的子类,对Model进行了封装,不需要我们自己去创建model对象,直接向xxxWidget中添加数据即可。

2.ListWidget控件

        该控件表示的是一个纵向的列表

属性
属性说明
currentRow当前被选中的是第几行
count一共有多少行
sortingEnabled是否允许排序
isWrapping是否允许换行
itemAlignment元素的对齐方式
selectRectVisible被选中的元素矩形是否可见
spacing元素之间的间隔
核心方法
方法说明

addItem(QString& label)

addItem(QListWidgetItem* item)

列表中添加元素
currentItem()返回当前选中的QListWidgetItem* 对象元素
setCurrentItem(QListWidgetItem* item)设置选中哪一个元素
setCurrentRow(int row)设置选中第几行的元素

insertItem(const QString& label, int row)

insertItem(QListWidgetItem* item, int row)

第一个是添加到最后一行,这个方法是插入到第row行
item(int row)获取第row行的QListWidgetItem* 对象元素
takeItem(int row)删除指定行的元素,返回删除的元素对象
核心信号
信号说明
currentItemChanged(QListWidgetItem* current, QListWidgetItem* old)选中不同元素的时候会触发,参数是当前选中的元素和之前选中的元素
currentRowChanged(int)选中不同元素的时候触发,参数是当前选中元素的行数
itemClicked(QListWidgetItem* item)点击某个元素的时候触发
itemDoubleClicked(QListWidgetItem* item)双击某个元素的时候触发
itemEntered(QListWidgetItem* item)鼠标进入元素范围触发
细节
  • 对于一个QListWidget控件,内部的元素是一个个的QListWidgetItem组成的。本质上改类的内部就是一个文本+图标构成,所以QListWidgetItem内部提供了很多操作文本和图标的方法。例如:设置字体、设置图标、设置对齐方式等内容。
Demo:编辑日程

        该demo中有QListWidget控件来显示日程列表,提供了两个按钮去进行操作日程表的添加和删除的操作,为添加按钮设置一个QLineEdit控件,在增加的时候,获取QLineEdit控件输入的内容,然后添加到日程表当中。删除的时候,获取到选中的是第几行,然后进行调用方法删除。

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//初始化日程表//以字符串形式添加元素ui->listWidget->addItem("健身");ui->listWidget->addItem("学习");ui->listWidget->addItem("打球");//用对象的形式添加元素QListWidgetItem* item = new QListWidgetItem("玩游戏");ui->listWidget->addItem(item);//匿名对象添加元素ui->listWidget->addItem(new QListWidgetItem("吃饭"));
}Widget::~Widget()
{delete ui;
}//增加日程
void Widget::on_pushButton_add_clicked()
{//获取lineEdit单行输入框中的内容const QString str = ui->lineEdit->text();//设置到listWidegt控件中ui->listWidget->addItem(new QListWidgetItem(str));
}//删除日程
void Widget::on_pushButton_del_clicked()
{//获取到被选中的元素的行号int row = ui->listWidget->currentRow();if(row < 0)return;//删除ui->listWidget->takeItem(row);
}

3.TableWidget控件 

        该控件表示的是一个表格控件,包括横向和纵向两个方向由若干行若干列组成,每一个表格都是由一个QTableWidgetItem对象构成。

核心方法
方法说明
item(int row, int column)根据行数和列数获取指定的QTableWidgetItem*对象
setItem(int row, int column, QTbleWidget*)根据行数列数设置表格中的元素
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*)设置指定列的表头
setVericalHeaderItem(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 prevuiousRow, int previousColumn)选中不同的单元格的时候触发
QTableWidgetItem核心方法
方法说明
row()获取当前在第几行
column()获取当前在第几列

setText(const QString&)

设置文本
setTextAlignment(int)设置文本呢对齐方式
setlcon(const QIcon&)设置图标
setSelected(bool)设置被选中
setSizeHints(const QSize&)设置尺寸
setFont(onst QFont&)设置字体

细节
  • 对于单元格默认程序运行之后是可以编写文本内容的,如果我们不想让用户去修改单元格中的内容的话,需要设置:

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

Demo:编辑学生信息
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setPlaceholderText("请输入新增的列名称");//创建3行3列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("2000"));ui->tableWidget->setItem(0, 1, new QTableWidgetItem("zhangsan"));ui->tableWidget->setItem(0, 2, new QTableWidgetItem("000-0000-0000"));ui->tableWidget->setItem(1, 0, new QTableWidgetItem("2001"));ui->tableWidget->setItem(1, 1, new QTableWidgetItem("lisi"));ui->tableWidget->setItem(1, 2, new QTableWidgetItem("123-4567-8901"));ui->tableWidget->setItem(2, 0, new QTableWidgetItem("2002"));ui->tableWidget->setItem(2, 1, new QTableWidgetItem("wangwu"));ui->tableWidget->setItem(2, 2, new QTableWidgetItem("342-4483-1992"));
}Widget::~Widget()
{delete ui;
}//增加一行
void Widget::on_pushButton_add_row_clicked()
{//获取行数int row_count = ui->tableWidget->rowCount();//增加一行ui->tableWidget->insertRow(row_count);
}//增加一列
void Widget::on_pushButton_column_add_clicked()
{//获取列数int column_count = ui->tableWidget->columnCount();//获取新增列的表头const QString str = ui->lineEdit->text();//如果为空的话,就不添加了if(str.isEmpty())return;//增加一列ui->tableWidget->insertColumn(column_count);//设置表头ui->tableWidget->setHorizontalHeaderItem(column_count, new QTableWidgetItem(str));
}//删除选中行
void Widget::on_pushButton_row_del_clicked()
{//获取当前选中的行int row = ui->tableWidget->currentRow();//删除ui->tableWidget->removeRow(row);
}//删除选中列
void Widget::on_pushButton_column_del_clicked()
{//获取当前选中的列int column = ui->tableWidget->currentColumn();//删除ui->tableWidget->removeColumn(column);
}

4.TreeWidget控件 

        该控件表示的是一个树形的控件,里面的每一元素都是一个QTreeWidgetItem对象,该对象内部可以包含多个文本和图标,每一个文本或者图标是一列。可以给QTreeWidget设置顶层节点,顶层节点可以是多个,然后再给顶层节点添加子节点,从而构成了树形结构。

核心方法
方法

说明

clear()清空所有子节点
addTopLevelItem(QTreeWidegtItem* 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名称
核心信号
信号说明

currentChanged(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核心方法
方法说明
addChild(QTreeWidgetItem* child)新增子节点
childCount()获取子节点个数
child(int index)

获取指定下标的子节点,返回QTreeWidgetItem对象指针

takeChild(int index)删除指定下标的子节点
removeChild(QTreeWidgetItem* child)删除对应的元素
parent()获取该元素的父节点
细节
  • 在添加顶层节点或者子节点传递QTreeWidgetItem对象的时候,在设置文本的时候,需要传递两个参数,第一个表示第n列,第二个参数是文本内容,因为QTreeWidgetItem对象可以有很多列,所以需要传递设置的文本是第几列。但是如果设置多列的话,那么我们对应的设置控件名称的时候就需要调用setHeaderLabels设置多个列名称了。这样的话才能显示出来我们设置的多列元素。
  • 对于删除的时候来说,删除的时候需要调用他的父节点的删除函数,所以说要考虑删除元素的是不是顶层元素,因为顶层元素没有父元素,所以需要调用控件的删除函数去删除顶层元素,如果不是的话,调用父节点的删除函数即可。
  • 如果删除的节点下面还有子节点的话,也会一起删除的。
控件使用案例
#include "widget.h"
#include "ui_widget.h"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);
}Widget::~Widget()
{delete ui;
}//添加顶层元素
void Widget::on_pushButton_topItem_add_clicked()
{//获取输入框的文本内容const QString& str = ui->lineEdit->text();if(str.isEmpty())return;//设置到顶层节点QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(0, str);ui->treeWidget->addTopLevelItem(item);
}//添加到选中元素
void Widget::on_pushButton_item_add_clicked()
{//获取输入框中的本文内容const QString& str = ui->lineEdit->text();if(str.isEmpty())return;//获取选中元素QTreeWidgetItem* item = ui->treeWidget->currentItem();if(item == nullptr)return;//添加节点QTreeWidgetItem* new_item = new QTreeWidgetItem();new_item->setText(0, str);item->addChild(new_item);//设置展开父节点item->setExpanded(true);
}//删除选中元素
void Widget::on_pushButton_item_del_clicked()
{//获取选中元素QTreeWidgetItem* item = ui->treeWidget->currentItem();if(item == nullptr)return;//获取父元素QTreeWidgetItem* parent = item->parent();//如果是顶层节点的话if(parent == nullptr){//获取下标int index = ui->treeWidget->indexOfTopLevelItem(item);//删除ui->treeWidget->takeTopLevelItem(index);}//非顶层节点else{parent->removeChild(item);}
}

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

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

相关文章

[Linux]从零开始的STM32MP157交叉编译环境配置

一、前言 最近该忙的事情也是都忙完了&#xff0c;也是可以开始好好的学习一下Linux了。之前九月份的时候就想入手一块Linux的开发板用来学习Linux底层开发。之前在NXP和STM32MP系列之间犹豫&#xff0c;思来想去还是入手了一块STM32MP157。当然不是单纯因为MP157的性能在NXP之…

小程序如何引入腾讯位置服务

小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意&#xff1a;小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务&#xff0c;如果没有就在插件管理中添加插件 2.腾讯位置服务…

添加计算机到AD域中

添加计算机到AD域中 一、确定计算机的DNS指向域中的DNS二、打开系统设置三、加域成功后 一、确定计算机的DNS指向域中的DNS 二、打开系统设置 输入域管理员的账密 三、加域成功后 这里有显示&#xff0c;就成功了。

从epoll事件的视角探讨TCP:三次握手、四次挥手、应用层与传输层之间的联系

目录 一、应用层与TCP之间的联系 二、 当通信双方中的一方如客户端主动断开连接时&#xff0c;仅是在客户端的视角下连接已经断开&#xff0c;在服务端的眼中&#xff0c;连接依然存在&#xff0c;为什么&#xff1f;——触发EPOLLRDHUP事件&#xff1a;对端关闭连接或停止写…

使用RSyslog将Nginx Access Log写入Kafka

个人博客地址&#xff1a;使用RSyslog将Nginx Access Log写入Kafka | 一张假钞的真实世界 环境说明 CentOS Linux release 7.3.1611kafka_2.12-0.10.2.2nginx/1.12.2rsyslog-8.24.0-34.el7.x86_64.rpm 创建测试Topic $ ./kafka-topics.sh --zookeeper 192.168.72.25:2181/k…

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载&#xff08;这里使用的是Ubuntu&#xff0c;Centos命令可能有不同&#xff09; 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile&#xff0c;并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …

《研发管理 APQP 软件系统》——汽车电子行业的应用收益分析

全星研发管理 APQP 软件系统在汽车电子行业的应用收益分析 在汽车电子行业&#xff0c;技术革新迅猛&#xff0c;市场竞争激烈。《全星研发管理 APQP 软件系统》的应用&#xff0c;为企业带来了革命性的变化&#xff0c;诸多收益使其成为行业发展的关键驱动力。 《全星研发管理…

22、PyTorch nn.Conv2d卷积网络使用教程

文章目录 1. 卷积2. python 代码3. notes 1. 卷积 输入A张量为&#xff1a; A [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] \begin{equation} A\begin{bmatrix} 0&1&2&3\\\\ 4&5&6&7\\\\ 8&9&10&11\\\\ 12&13&14&15 \end{b…

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

UE5游戏性能优化指南

解除帧率限制 启动游戏 按 “~” 键 输入 t.MaxFPS 200 可以解除默认帧率限制达到更高的帧率 UE游戏性能和场景优化思路&#xff1a; 1. 可以把可延展性调低&#xff0c;帧率会大幅提高&#xff0c;但画质会大幅降低 2.调整固定灯光&#xff0c;静态光源&#xff…

深度学习中的卷积和反卷积(四)——卷积和反卷积的梯度

本系列已完结&#xff0c;全部文章地址为&#xff1a; 深度学习中的卷积和反卷积&#xff08;一&#xff09;——卷积的介绍 深度学习中的卷积和反卷积&#xff08;二&#xff09;——反卷积的介绍 深度学习中的卷积和反卷积&#xff08;三&#xff09;——卷积和反卷积的计算 …

【C语言】线程

目录 1. 什么是线程 1.1概念 1.2 进程和线程的区别 1.3 线程资源 2. 函数接口 2.1创建线程: pthread_create 2.2 退出线程: pthread_exit 2.3 回收线程资源 练习 1. 什么是线程 1.1概念 线程是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程。 在同一个进…

【C语言】字符串函数详解

文章目录 Ⅰ. strcpy -- 字符串拷贝1、函数介绍2、模拟实现 Ⅱ. strcat -- 字符串追加1、函数介绍2、模拟实现 Ⅲ. strcmp -- 字符串比较1、函数介绍2、模拟实现 Ⅳ. strncpy、strncat、strncmp -- 可限制操作长度Ⅴ. strlen -- 求字符串长度1、函数介绍2、模拟实现&#xff08…

Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)

本文介绍在Windows电脑中&#xff0c;下载、部署NVM&#xff08;node.js version management&#xff09;环境&#xff0c;并基于其安装不同版本的Node.js的方法。 在之前的文章Windows系统下载、部署Node.js与npm环境的方法&#xff08;https://blog.csdn.net/zhebushibiaoshi…

centos 8 中安装Docker

注&#xff1a;本次样式安装使用的是centos8 操作系统。 1、镜像下载 具体的镜像下载地址各位可以去官网下载&#xff0c;选择适合你们的下载即可&#xff01; 1、CentOS官方下载地址&#xff1a;https://vault.centos.org/ 2、阿里云开源镜像站下载&#xff1a;centos安装包…

STM32-笔记40-BKP(备份寄存器)

一、什么是BKP&#xff08;备份寄存器&#xff09;&#xff1f; 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或…

vue-cli项目配置使用unocss

在了解使用了Unocss后&#xff0c;就完全被它迷住了。接手过的所有项目都配置使用了它&#xff0c;包括一些旧项目&#xff0c;也跟同事分享了使用Unocss的便捷性。 这里分享一下旧项目如何配置和使用Unocss的&#xff0c;项目是vue2vue-cli构建的&#xff0c;node<20平常开…

新增文章分类功能

总说 过程参考黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 目录 总说 一、功能实现 1.1 Controller层 1.2 Service层 1.3 Impl层 1.4 Mapper层 1.5 测试接口 二、优化 2.1 2.2 一、…

知识图谱常见的主流图数据库

在知识图谱中&#xff0c;主流使用的图数据库包括以下几种&#xff1a; Neo4j&#xff1a;这是目前全球部署最广泛的图数据库之一&#xff0c;具有强大的查询性能和灵活的数据模型&#xff0c;适用于复杂关系数据的存储和查询。 JanusGraph&#xff1a;JanusGraph是一个开源的…

JavaSE学习心得(多线程与网络编程篇)

多线程-网络编程 前言 多线程&JUC 多线程三种实现方式 第一种实现方式 第二种实现方式 第三种实现方式 常见成员方法 买票引发的安全问题 同步代码块 同步方法 Lock锁 生产者和消费者 常见方法 等待唤醒机制 练习 抢红包 抽奖 多线程统计并求最…