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

news2025/1/16 19:28:54

目录

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.coloradmin.cn/o/2277670.html

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

相关文章

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…

基于STM32设计的粮食仓库(粮仓)环境监测系统

一、前言 1.1 项目开发背景 随着现代农业的发展和粮食储存规模的扩大&#xff0c;粮仓环境的智能化监控需求日益增长。传统的粮仓管理方式通常依赖人工检测和定期巡查&#xff0c;效率低下且容易出现疏漏&#xff0c;无法及时发现潜在问题&#xff0c;可能导致粮食受潮、霉变…

【Linux】--- 进程的等待与替换

进程的等待与替换 一、进程等待1、进程等待的必要性2、获取子进程status3、进程等待的方法&#xff08;1&#xff09;wait&#xff08;&#xff09;函数&#xff08;2&#xff09;waitpid函数 4、多进程创建以及等待的代码模型5、非阻塞接口 轮询 二、进程替换1、替换原理2、替…

Vue2+OpenLayers添加/删除点、点击事件功能实现(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、安装Element-UI 四、代码实现 4.1、添加一个点 4.2、删除所有点 4.3、根据经纬度删除点 4.4、给点添加点击事件 4.5、完整代码 五、Gitee源码 一、案例截图 可以新增/删除标记点&#xff0c;点击标记点可以获取到当前标…

HTML中如何保留字符串的空白符和换行符号的效果

有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} &#xff0c; HTML中想要保留 \n的换行效果的有下面3种方法&#xff1a; 1、style 中 设置 white-space: pre-lin…

GB44495-2024 汽车整车信息安全技术要求 - V2X部分前置要求

背景 GB 44495-2024《汽车整车信息安全技术要求》中关于V2X&#xff08;车与外界通信&#xff09;的部分&#xff0c;主要关注于通信安全要求&#xff0c;旨在确保车辆在与外部设备进行数据交互时的信息安全。其测试大致可分为消息层&#xff08;数据无异常&#xff09;、应用…

[PAT 甲级] 1179 Chemical Equation (DFS)

​ 题目翻译&#xff08;GPT&#xff09;&#xff1a; 1179 化学方程式 化学方程式是一种用符号和公式表示化学反应的方法&#xff0c;其中反应物在方程式的左侧&#xff0c;生成物在右侧。例如&#xff1a; CH₄ 2O₂ -> CO₂ 2H₂O 表示反应物为甲烷和氧气&#xff…

android分区和root

线刷包内容&#xff1a; 线刷包是一个完整的android镜像&#xff0c;不但包括android、linux和用户数据&#xff0c;还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区&#xff0c;包括linux下主要的二进制程序。 boot.img…

每日一题(五):n个正整数排列,求组合后最大数

目录 一、题目 二、题目分析 &#xff08;一&#xff09;明确需求 背景知识&#xff1a;字符串的比较与连接 1.字符串的比较 2.字符串的连接 (二)分析思路 三、将思路转换为程序 四、总结 一、题目 给定n个正整数a1,a2,……,an对这n个数进行排列&#xff0c;求组合后可以得到…

【STM32-学习笔记-3-】TIM定时器

文章目录 TIM定时器Ⅰ、TIM定时器函数Ⅱ、TIM_TimeBaseInitTypeDef结构体参数①、TIM_ClockDivision②、TIM_CounterMode③、TIM_Period④、TIM_Prescaler⑤、TIM_RepetitionCounter Ⅱ、定时器配置Ⅲ、定时器外部中断NVIC配置 TIM定时器 Ⅰ、TIM定时器函数 // 将定时器寄存器…

【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读…

新垂直电商的社交传播策略与AI智能名片2+1链动模式S2B2C商城小程序的应用探索

摘要&#xff1a;随着互联网技术的不断进步和电商行业的快速发展&#xff0c;传统电商模式已难以满足消费者日益增长的个性化和多元化需求。新垂直电商在此背景下应运而生&#xff0c;通过精准定位、用户细分以及深度社交传播策略&#xff0c;实现了用户群体的快速裂变与高效营…

【ORACLE战报】2025.1月OCP | MySQL考试

2025.1月【最新考试成绩出炉】 OCP战报 MySQL 战报 部分学员成绩及证书

九 RK3568 android11 MPU6500

一 MPU6500 内核驱动 1.1 查询设备连接地址 查看原理图, MPU6500 I2C 连接在 I2C4 上, 且中断没有使用 i2c 探测设备地址为 0x68 1.2 驱动源码 drivers/input/sensors/gyro/mpu6500_gyro.c drivers/input/sensors/accel/mpu6500_acc.c 默认 .config 配置编译了 mpu6550 …

Android JecPack组件之LifeCycles 使用详解

一、背景 LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息&#xff0c;当宿主生命周期发生变化时&#xff0c;会通知监听宿主的观察者。 LifeCycle 的出现主要是为了…

机器学习(2):线性回归Python实现

1 概念回顾 1.1 模型假设 线性回归模型假设因变量y yy与自变量x xx之间的关系可以用以下线性方程表示&#xff1a; y β 0 β 1 ⋅ X 1 β 2 ⋅ X 2 … β n ⋅ X n ε y 是因变量 (待预测值)&#xff1b;X1, X2, ... Xn 是自变量&#xff08;特征&#xff09;β0, β1,…

2025.1.15——二、字符型注入

一、基本操作&#xff1a;整理已知信息&#xff0c;本题为字符型注入 二、解题步骤 step 1&#xff1a;确认为字符型注入 键入&#xff1a; 1 键入&#xff1a;1 and 12 # 发现报错 键入&#xff1a;1 and 11 # 未发现报错 所以确认为字符型注入 step 2&#xff1a;查询…

4、dockerfile实现lnmp和elk

dockerfile实现lnmp 使用dockerfile n&#xff1a;nginx&#xff0c;172.111.0.10 m&#xff1a;mysql&#xff0c;172.111.0.20 p&#xff1a;php&#xff0c;172.111.0.30 安装配置nginx 1、准备好nginx和wordpress安装包 2、配置dockerfile 3、配置nginx主配置文件ngin…

金融项目实战 05|Python实现接口自动化——登录接口

目录 一、代码实现自动化理论及流程 二、脚本实现的理论和准备工作 1、抽取功能转为自动化用例 2、搭建环境(测试工具) 3、搭建目录结构 三、登录接口脚本实现 1、代码编写 1️⃣api目录 2️⃣script目录 2、断言 3、参数化 1️⃣编写数据存储文件&#xff1a;jso…

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置&#xff1a; 代码通过 FlinkKafkaProducer 创建 Kafka 生产者&#xff0c;用于向 Kafka 主题发送消息。Flink 执行环境的配置&#xff1a; 配置了 Flink 的检查点机制&#xff0c;确保消息的可靠性&#xff0c;支…