【Qt 常用控件】多元素控件(QListWidget、QTableWidgt、QTreeWidget)

**View和**Widget的区别?
**View的实现更底层,**Widget是基于**View封装实现的更易用的类型。

**View使用MVC结构

MVC是软件开发中 经典的 软件结构 组织形式,软件设计模式。

M(model)模型。管理应用程序的核心数据和业务逻辑。并且通知视图和控制器数据已经发生变化。

V(view)视图,界面。显示数据,并接受用户输入。

C(controller)控制器。衔接M和V,处理用户输入,更新模型和视图。

**View只负责视图,并不具备其他功能,如数据存储、业务逻辑。

使用**View需要程序员自己写,model和controller部分。

**Widget已经封装好,具备各部分功能,并提供接口设置自定义部分。

1.QListWidget 列表控件

  • 功能:显示纵向的列表,每个选项都可以被选中
currentRow当前被选中的的是第几行
count一共多少行
sortingEnabled

是否允许排序

isWrapping是否允许换行
itemAlinment元素对齐方式
selectRectVisible被选中元素的矩形是否可见
spacing元素之间的间隔
  • 方法:
     

addItem(const QString& label)

addItem(QListWidget Item* item)

添加元素
currentItem()返回QListWidgetItem*,返回当前选中元素指针
setCurrentItem(QListWidgetItem* item)设置选中元素,参数指针。
setCurrentRow(int row)设置选中元素,参数行号(从0开始)
insertItem(const QString& label,int  row) insertItem(QListWidgetItem *item , int row)指定行号,插入一个新元素。
item(int row)返回指定行号的元素,返回QListWidgetItem*
takeItem(int row)删除指定行的元素,返回被删除元素的QListWidgetItem*
  • 信号:
     
currentItemChanged(QListWidgetItem* current,QListWidgetItem*old)

选中元素改变时触发。

参数是新当前选中,和上一个选中的元素指针。

currentRowChanged(int)

选中元素改变时触发。

参数是当前选中元素的行号。

itemClicked(QListWidgetItem* item)点击某个元素时触发。
itemDoubleClicked(QListWidgetItem*  item)双击某个元素时触发。
itemEntered(QListWidgetItem* item)鼠标悬停在选项之上时触发。

例:通过按钮添加/删除行

#include "widget.h"
#include "ui_widget.h"
#include<QString>
#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //添加元素
    ui->listWidget->addItem("C++");
    ui->listWidget->addItem("Java");
    ui->listWidget->addItem(new QListWidgetItem("Python"));

}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()//新增选项
{
    //获取输入框内容
    QString str=ui->lineEdit->text();
    if(str==""){return ;}

    //新增列表选项
    ui->listWidget->addItem(str);
}

void Widget::on_pushButton_2_clicked()//删除元素
{
    //获取当前选中元素
    int row=ui->listWidget->currentRow();

    ui->listWidget->takeItem(row);
}

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

    if(previous!=nullptr)
    {
        qDebug()<<"上一个选中元素:"<<previous->text();
    }
}

2.QTableWidget 表格控件

  • QTableWidget核心方法:
item(int row, int column)获取指定行列的元素,QTableWidgetItem* 
setItem(int row, int column, QTableWidget*)指定行列,设置单元格的元素
currentItem()获取当前选中元素
currentRow()获取当前选中元素的行号
currentColumn()获取当前选中元素的列号
row(QTableWidgetItem*)获取指定元素的行号
column(QTableWidgetItem*)获取指定元素的列号
rowCount()获取总行数
columnCount()获取总列数
insertRow(int row)插入新的一行,在指定行号
insertColumn(int column)插入新的一列,在指定列号
removeRow(int row)删除指定行
removeColumn(int 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 QSting&)设置文本
setTextAlignment(int)设置文本对齐方式
setIcon(const QIcon&)设置图标
setSelected(bool)设置被选中
setSizeHints(const QSize&)设置尺寸
setFont(const QFont&)设置字体

例:通过按钮,添加行/列,删除行/列

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //初始化表格
    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("班级"));

    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            ui->tableWidget->setItem(i,j,new QTableWidgetItem("0"));
        }
    }

}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_insertRow_clicked()
{
    //默认在末尾插入一行
    //获取当前的行数
    int row_count=ui->tableWidget->rowCount();

    ui->tableWidget->insertRow(row_count);
}

void Widget::on_pushButton_insetColumn_clicked()
{
    int column_count=ui->tableWidget->columnCount();

    ui->tableWidget->insertColumn(column_count);

    //设置表头
    QString s=ui->lineEdit->text();
    if(s.isEmpty()==true)
    {
        return ;
    }

    ui->tableWidget->setHorizontalHeaderItem(column_count,new QTableWidgetItem(s));
}

void Widget::on_pushButton_deleteRow_clicked(bool checked)
{
    //删除选中的行
    int current=ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(current);
}

void Widget::on_pushButton_4_clicked()
{
    //删除选中的行
    int current=ui->tableWidget->currentColumn();
    ui->tableWidget->removeColumn(current);
}

行列数过多后,表格会自动添加滚动条。

3.QTreeWidget 树形控件

  • 功能:树形控件,每一个元素是QTreeWidgetItem,每个QTreeWidgetItem 可以包含多个⽂本和图标,每个⽂本/图标为⼀个列。

但这个树形结构,不一定只有一个根节点,把顶层节点称为topLevelItem。

  • 方法
clear()清空所有子节点
addTopLevelItem(QTreeWidgetItem* item)新增顶层节点
topLevelItem(int index)获取指定下标的顶层节点
topLevelItemCount()获取顶层节点的个数
indexOfTopLevelItem(QTreeWidgetItem*  item)获取节点在顶层节点中的下标
takeTopLevelItem(int index)

根据下标,删除指定的顶层节点。返回被删除元素指针。

只能这样删除顶层元素,必须先获取下标。

currentItem()获取当前选中节点的指针
setCurrentItem(QTreeWidgetItem* item)设置选中节点
setExpanded(bool)展开/关闭子节点

setHeaderLabel(const QString& text)

setHeaderItem()

设置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文本
textAlign文本对齐方式
icon持有的图标
font字体

hidden

是否隐藏
disabled是否禁用
expand是否展开
sizeHint尺寸大小
selected是否选中

  • QTreeWidgetItem核心方法
addChild(QTreeWidgetItem* child)新增子节点
childCount()子节点个数
child(int index)获取指定下标的子节点,返回指针
takeChild(int index)删除对应下标的子节点
removeChild(QTreeWidgetItem* child)删除对应的子节点
parent()获取该元素的父节点

例:添加节点的方式

图形化方式添加节点

代码方式

#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);

    QTreeWidgetItem* item3 =new QTreeWidgetItem();
    item3->setText(0,"鸟");//每个节点都可以有多列,指定不同下标就可以
    ui->treeWidget->addTopLevelItem(item3);


     QTreeWidgetItem* item4 =new QTreeWidgetItem();
     item4->setText(0,"暹罗");
     QTreeWidgetItem* item5 =new QTreeWidgetItem();
     item5->setText(0,"加菲");
     QTreeWidgetItem* item6 =new QTreeWidgetItem();
     item6->setText(0,"虎斑");

     item1->addChild(item4);
     item1->addChild(item5);
     item1->addChild(item6);

}

Widget::~Widget()
{
    delete ui;
}

例:通过按钮,添加顶层节点/普通节点/删除节点

#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);

    QTreeWidgetItem* item3 =new QTreeWidgetItem();
    item3->setText(0,"鸟");//每个节点都可以有多列,指定不同下标就可以
    ui->treeWidget->addTopLevelItem(item3);


     QTreeWidgetItem* item4 =new QTreeWidgetItem();
     item4->setText(0,"暹罗");
     QTreeWidgetItem* item5 =new QTreeWidgetItem();
     item5->setText(0,"加菲");
     QTreeWidgetItem* item6 =new QTreeWidgetItem();
     item6->setText(0,"虎斑");

     item1->addChild(item4);
     item1->addChild(item5);
     item1->addChild(item6);

}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_insertTop_clicked()
{
    QString text=ui->lineEdit->text();
    if(text.isEmpty()==true)
    {
        return ;
    }

    QTreeWidgetItem* item=new QTreeWidgetItem();
    item->setText(0,text);
    ui->treeWidget->addTopLevelItem(item);
}

void Widget::on_pushButton_insert_clicked()
{
    //获取选中的元素
    QTreeWidgetItem* it=ui->treeWidget->currentItem();
    if(it==nullptr)
    {
        return ;
    }

    QString text=ui->lineEdit->text();
    if(text.isEmpty()==true)
    {
        return ;
    }

    QTreeWidgetItem* item=new QTreeWidgetItem();
    item->setText(0,text);


    it->addChild(item);

}

void Widget::on_pushButton_delete_clicked()
{

    QTreeWidgetItem* it=ui->treeWidget->currentItem();
    if(it==nullptr)
    {
        return ;
    }

    //获取当前元素的父节点
    QTreeWidgetItem* parent=it->parent();

    //父节点为空。说明当前节点为顶层节点
    //获取当前选中节点的下标
    if(parent==nullptr)
    {
        int index=ui->treeWidget->indexOfTopLevelItem(it);
        ui->treeWidget->takeTopLevelItem(index);//删除顶层节点
    }
    else
    {
        parent->removeChild(it);
    }


}

上述对界面的操作都是内存级别的操作,程序重启后就会恢复到初始状态。

想要保留操作变化,需要额外的数据持久化操作。写入文件,运行时重写读取文件加载数据。

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

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

相关文章

Flappy Bird开发学习记录

概述 为了了解一下Unity的开发过程&#xff0c;或者说感受&#xff1f;先搞简单的练练手。 工具 Unity:2022.3.51f1c1 visual studio 2022 开发过程 项目基本设置 新建2d项目&#xff0c;游戏画面设置为1080*1920&#xff08;9&#xff1a;16&#xff09;。 图片素材设…

35~37.ppt

目录 35.张秘书-《会计行业中长期人才发展规划》 题目​ 解析 36.颐和园公园&#xff08;25张PPT) 题目​ 解析 37.颐和园公园&#xff08;22张PPT) 题目 解析 35.张秘书-《会计行业中长期人才发展规划》 题目 解析 插入自定义的幻灯片&#xff1a;新建幻灯片→重用…

19.4.6 读写数据库中的二进制数据

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 北风数据库中&#xff0c;类别表的图片字段在【数据表视图】中显示为Bitmap Image&#xff1…

sqli-lab靶场学习(六)——Less18-22(User-Agent、Referer、Cookie注入)

前言 前面的关卡&#xff0c;都是直接在输入框或者浏览器的地址栏上做文章即可。但本文这几关&#xff0c;需要用工具拦截请求修改请求头部才行。 Less18&#xff08;User-Agent注入&#xff09; 本关的注入点在User-Agent。我们在用户名和密码框中输入admin/admin后&#xf…

uniapp 使用 鸿蒙开源字体

uniapp vue3 使用 鸿蒙开源字体 我的需求是全局使用鸿蒙字体。 所以&#xff1a; 0. 首先下载鸿蒙字体&#xff1a; 鸿蒙资源 下载后解压&#xff0c;发现里面有几个文件夹&#xff1a; 字体名称说明Sans默认的鸿蒙字体&#xff0c;支持基本的多语言字符&#xff08;包括字…

【ESP32指向鼠标】——icm20948与esp32通信

【ESP32指向鼠标】——icm20948与esp32通信 ICM-20948介绍 ICM-20948 是一款由 InvenSense&#xff08;现为 TDK 的一部分&#xff09;生产的 9 轴传感器集成电路。它结合了 陀螺仪、加速度计和磁力计。 内置了 DMP&#xff08;Digital Motion Processor&#xff09;即负责执…

机器学习(李宏毅)——BERT

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 读这篇文章必须先了解self-attention、Transformer&#xff0c;可参阅我其他文章。 二、大纲 BERT简介self-…

NO.12十六届蓝桥杯备战|关系操作符|操作符连用|浮点数比较|练习2道(C++)

关系操作符 关系操作符介绍 ⽤于⽐较的表达式&#xff0c;称为“关系表达式”&#xff08;relational expression&#xff09;&#xff0c;⾥⾯使⽤的运算符就称为“关 系运算符”&#xff08;relational operator&#xff09;&#xff0c;主要有下⾯6个。 运算符描述>⼤…

JVM组成

JVM是什么&#xff1f; JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a;Java程序的运行环境(java二进制字节码的运行环境) 好处&#xff1a; 1.一次编写&#xff0c;到处运行 Java代码是如何做到一次编写&#xff0c;到处运行&#xff1f; 计算机的最底层是计…

不小心删除服务[null]后,git bash出现错误

不小心删除服务[null]后&#xff0c;git bash出现错误&#xff0c;如何解决&#xff1f; 错误描述&#xff1a;打开 git bash、msys2都会出现错误「bash: /dev/null: No such device or address」 问题定位&#xff1a; 1.使用搜索引擎搜索「bash: /dev/null: No such device o…

130,[1] 攻防世界 very_easy_sql

进入靶场 典型SQL注入页面 先查看源码 访问 试试http://127.0.0.1/ 还尝试了其他都是nonono 回归第一个登录页面 提交的内容不在url处显示&#xff0c;反而第二个url页面会在url处显示 明白第一个页面是通过post方式提交&#xff0c;反正没得到什么信息&#xff0c;去抓…

Android10 音频参数导出合并

A10 设备录音时底噪过大&#xff0c;让音频同事校准了下&#xff0c;然后把校准好的参数需要导出来&#xff0c;集成到项目中&#xff0c;然后出包&#xff0c;导出方式在此记录 设备安装debug系统版本调试好后&#xff0c; adb root adb remount adb shell 进入设备目录 导…

django中间件,中间件给下面传值

1、新建middleware.py文件 # myapp/middleware.py import time from django.http import HttpRequest import json from django.http import JsonResponse import urllib.parse from django.core.cache import cache from comm.Db import Db class RequestTimeMiddleware:def …

24电子信息类研究生复试面试问题汇总 电子信息类专业知识问题最全!电子信息复试全流程攻略 电子信息考研复试真题汇总

你是不是在为电子信息考研复试焦虑&#xff1f;害怕被老师问到刁钻问题、担心专业面答不上来&#xff1f;别慌&#xff01;作为复试面试92分逆袭上岸的学姐&#xff0c;今天手把手教你拆解电子信息类复试通关密码&#xff01;看完这篇&#xff0c;让你面试现场直接开大&#xf…

LVDS接口总结--(1)LVDS硬件电路接口

1.LVDS差分信号电路原理 LVDS指的是低压差分信号&#xff0c;是一种电平标准。 差分信号在串行通信中有着非常广泛的应用&#xff0c;典型应用有PCIE中的gen1&#xff0c;gen2&#xff0c;gen3&#xff0c;gen4&#xff0c;gen5&#xff0c;SATA接口&#xff0c;USB接口等。 …

【STM32】HAL库Host MSC读写外部U盘及FatFS文件系统的USB Disk模式

【STM32】HAL库Host MSC读写外部U盘及FatFS文件系统的USB Disk模式 在先前 分别介绍了FatFS文件系统和USB虚拟U盘MSC配置 前者通过MCU读写Flash建立文件系统 后者通过MSC连接电脑使其能够被操作 这两者可以合起来 就能够实现同时在MCU、USB中操作Flash的文件系统 【STM32】通过…

第四期书生大模型实战营-第5关-L2G5000

1 Web 版茴香豆 助教说这趴先跳过&#xff0c;那我就跳过 2 茴香豆本地标准版搭建 2.1 环境搭建 2.2 安装茴香豆 2.3 知识库创建 2.4 测试知识助手 2.4.1 命令行运行 2.4.2 Gradio UI 界面测试 确认一下是否正常 完美。 至于选做&#xff0c;我这么懒&#xff0c;怎么可能…

Elastic Cloud Serverless 现已在 Microsoft Azure 上提供技术预览版

作者&#xff1a;来自 Elastic Yuvi Gupta Elastic Cloud Serverless 提供了启动和扩展安全性、可观察性和搜索解决方案的最快方法 — 无需管理基础设施。 今天&#xff0c;我们很高兴地宣布 Microsoft Azure 上的 Elastic Cloud Serverless 技术预览版现已在美国东部地区推出。…

go语言简单快速的按顺序遍历kv结构(map)

文章目录 需求描述用map实现按照map的key排序用二维切片实现用结构体实现 需求描述 在go语言中&#xff0c;如果需要对map遍历&#xff0c;每次输出的顺序是不固定的&#xff0c;可以考虑存储为二维切片或结构体。 假设现在需要在页面的下拉菜单中展示一些基础的选项&#xff…

TDengine 产品由哪些组件构成

目 录 背景产品生态taosdtaosctaosAdaptertaosKeepertaosExplorertaosXtaosX Agent应用程序或第三方工具 背景 了解一个产品&#xff0c;最好从了解产品包括哪些内容开始&#xff0c;我这里整理了一份儿 TDegnine 产品包括有哪些组件&#xff0c;每个组件作用是什么的说明&a…