【QT入门】 QListWidget各种常见用法详解之列表模式

往期回顾

【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客

【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客

【QT入门】 QTabWidget各种常见用法详解-CSDN博客

 【QT入门】 QListWidget各种常见用法详解之列表模式

QListWidget有列表和图标两种显示模式,默认是列表模式我们就先看列表模式。

enum ViewMode
{
ListMode, //列表模式
IconMode //图标模式
};

 一样的,学一个新的控件,首先要看他是怎么构造的,其次看怎么用,常用的方法,然后要去看他的信号函数,特别是熟悉常用方法和信号。而且ui界面创建和手动代码创建都要学会。

一、UI界面创建

ui界面创建List Widget是很简单的,找到List Widget拖动到窗口上即可。

在里面可以实现添加,删除选项的基本功能,还能对添加的每个Item进行样式设计,添加图片等,ui操作简单明了,还很容易实现。

二、手动代码创建 

1、最终效果

2、QListWidgetItem 

主要用到的就是 QListWidgetItem 这个类去创建QListWidget里面的选项,也就是Item

我先用ui搭建了整体框架

然后再用代码添加Item,用addItem()方法。

代码很简单,就没什么好说的,方法参数什么的,忘记了就点进去看。

值得一提的是,这里依旧是可以自定义Item对象,因为Item里面实际放的是Widget,所以我们可以创建Widget对象用ui界面设计了放进Item对象里去。最终效果里的头像、昵称、内容就是用的自定义Item对象,搭了一个大概框架,如果做精细化,其实就类似于微信里一个个好友聊天框。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QListWidgetItem *pListItem1 = new QListWidgetItem(QIcon(":/new/prefix2/res/editor.png"),"editor");
    QListWidgetItem *pListItem2 = new QListWidgetItem(QIcon(":/new/prefix2/res/env.png"),"env");
    QListWidgetItem *pListItem3 = new QListWidgetItem(QIcon(":/new/prefix2/res/help.png"),"help");
    QListWidgetItem *pListItem4 = new QListWidgetItem(QIcon(":/new/prefix2/res/kits.png"),"kits");
    QListWidgetItem *pListItem5 = new QListWidgetItem(QIcon(":/new/prefix2/res/vim.png"),"vim");
    QListWidgetItem *pListItem6 = new QListWidgetItem;

    ui->listWidget->addItem(pListItem1);
    ui->listWidget->addItem(pListItem2);
    ui->listWidget->addItem(pListItem3);
    ui->listWidget->addItem(pListItem4);
    ui->listWidget->addItem(pListItem5);
    ui->listWidget->addItem(pListItem6);

    CuserItem *cuseritem = new CuserItem(this);
    ui->listWidget->setItemWidget(pListItem6,cuseritem);

}

三、附加功能:右键单击菜单,item删除

这里主要是对列表模式的一个扩展,就是说当我们用列表模式能够在listWidget里显示item的时候,我们想要实现单击选项出现菜单,实现删除item等功能。

1、思路

1、先是创建item加入到listWidget里面去,
2、然后是执行初始化菜单函数,在初始化函数的实现里,创建action对象并对每个对象连接相应的槽函数
3、设置菜单策略,不设置无法显示菜单
4、最后是连接item对象和菜单,也就是右键单击item才出现相应的菜单

2、知识点分析

 2.1、设置菜单策略
1、ui.listWidget->setContextMenuPolicy(Qt::CustomContextMenu);

将listWidget对象的上下文菜单策略设置为Qt::CustomContextMenu。这意味着可以为列表部件设置自定义上下文菜单。必须设置,不然无法显示菜单。

2.2、创建指针
2、QListWidgetItem* pItem = ui.listWidget->itemAt(pos);

这行代码创建了一个指向QListWidgetItem对象的指针pItem,该对象对应于listWidget中位置pos处的项目。

要知道这个itemAt方法,是Qt中用于检索给定坐标位置处的列表部件中的项目的方法 

QListWidgetItem* QListWidget::itemAt(const QPoint& position) const;

如果给定的位置处有项目,则返回一个指向该项目的QListWidgetItem指针;如果该位置没有项目,则返回nullptr。这个方法通常用于处理鼠标事件,以确定用户单击或右键单击的是哪个项目。 由于我们要是实现单击选择删除item,所以需要用到这个方法。

2.3、删除item
2.3.1动态删除

知道item的名字, 根据名字删除,这种可用于用户掉线,信息丢失等。

在listWidget中查找包含字符串"kits"的项目,然后将找到的第一个匹配项目移除并删除。

2.3.1.1代码示例
      QList<QListWidgetItem*> list;
      list = ui.listWidget->findItems("kits", Qt::MatchCaseSensitive);
      QListWidgetItem* sel = list[0];
      int r = ui.listWidget->row(sel);
      QListWidgetItem* item = ui.listWidget->takeItem(r); 
      ui.listWidget->removeItemWidget(item);
      delete item; 

我们一一分析这段代码:

QList<QListWidgetItem*> list;声明了一个QList类型的列表list,用于存储QListWidgetItem*指针。
list = ui.listWidget->findItems("kits", Qt::MatchCaseSensitive);调用findItems函数在listWidget中查找内容为"kits"的项目,并以区分大小写的方式进行匹配。搜索结果存储在列表list中。
QListWidgetItem* sel = list[0];从存储搜索结果的列表中获取第一个匹配项,并将其赋值给指针sel。        
int r = ui.listWidget->row(sel);获取项目sel在listWidget中的行索引,并将其存储在变量r中。
QListWidgetItem* item = ui.listWidget->takeItem(r);从listWidget中移除第r行的项目,并将其返回给指针item。此时,该项目已经不再属于listWidget。
ui.listWidget->removeItemWidget(item);        移除与项目item关联的部件。这一步是为了确保在删除项目之前先移除其部件,以避免内存泄漏。
delete item;删除项目item对象,释放其在内存中的空间。
2.3.2右键点击删除
QListWidgetItem* item = ui.listWidget-> currentItem();
ui.listWidget->removeItemWidget(item);
delete item;

这个就没什么好说的,很简单,推荐用这个,就是找到当前点击的item并移除。 

3、完整实例代码

#include "QListWidget_02.h"
#include <QListWidgetItem>
#include <QAction>
#include <QMessageBox>

QListWidget_02::QListWidget_02(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    
    QListWidgetItem* pListItem1 = new QListWidgetItem(QIcon(":/QListWidget_02/res/editor.png"), "editor");
    QListWidgetItem* pListItem2 = new QListWidgetItem(QIcon(":/QListWidget_02/res/env.png"), "env");
    QListWidgetItem* pListItem3 = new QListWidgetItem(QIcon(":/QListWidget_02/res/help.png"), "help");
    QListWidgetItem* pListItem4 = new QListWidgetItem(QIcon(":/QListWidget_02/res/kits.png"), "kits");
    QListWidgetItem* pListItem5 = new QListWidgetItem(QIcon(":/QListWidget_02/res/vim.png"), "vim");

    ui.listWidget->addItem(pListItem1);
    ui.listWidget->addItem(pListItem2);
    ui.listWidget->addItem(pListItem3);
    ui.listWidget->addItem(pListItem4);
    ui.listWidget->addItem(pListItem5);

    initRight();

    //设置菜单策略,必须设置,不然无法显示菜单
    ui.listWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    //连接信号槽
    connect(ui.listWidget, &QListWidget::customContextMenuRequested, 
        this, &QListWidget_02::onPopupRightMenu);

}

QListWidget_02::~QListWidget_02()
{}

void QListWidget_02::onPopupRightMenu(const QPoint& pos)
{
    QListWidgetItem* pItem = ui.listWidget->itemAt(pos);

    if (!pItem)
    {
        return;
    }

    m_pRightMenu->exec(QCursor::pos());
}

void QListWidget_02::initRight()
{
    m_pRightMenu = new QMenu(this);

    QAction* qAce1 = new QAction(u8"动作一", this);
    QAction* qAce2 = new QAction(u8"动作二", this);
    QAction* qAce3 = new QAction(u8"动作三", this);
    QAction* qAce4 = new QAction(u8"删除", this);

    m_pRightMenu->addAction(qAce1);
    m_pRightMenu->addAction(qAce2);
    m_pRightMenu->addAction(qAce3);
    m_pRightMenu->addAction(qAce4);

    connect(qAce1, &QAction::triggered, [=] {
        QMessageBox::information(this, "title", "qAce1");
        });

    connect(qAce4, &QAction::triggered, [=] {
    //方式1:知道item的名字, 根据名字删除,这种可用于用户掉线,信息丢失等,动态删除
      //  QList<QListWidgetItem*> list;
      //list = ui.listWidget->findItems("kits", Qt::MatchCaseSensitive);
      //QListWidgetItem* sel = list[0];
      //int r = ui.listWidget->row(sel);
      //QListWidgetItem* item = ui.listWidget->takeItem(r); ui.listWidget->removeItemWidget(item);
      //delete item; 


    //方式2:
    //    右键点击删除,或者选中删除
            QListWidgetItem* item = ui.listWidget-> currentItem();
        ui.listWidget->removeItemWidget(item);
        delete item;

        });
}

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

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

相关文章

Blenderproc渲染6D位姿估计数据集

https://github.com/DLR-RM/BlenderProc/tree/main/examples/datasets/bop_challenge 目录 1.3d渲染原理 2.步骤 3.代码 生成mask_all 4.难例渲染 物体高反光​编辑​编辑强弱灯光(明暗)​编辑​编辑​编辑物体xyz范围缩小 物体重复 干扰物&#xff08;自定义干扰物遮…

C#实现身份证格式验证(自建异常实现提醒)

基本信息 中国居民身份证的格式包括18位数字&#xff0c;这些数字分别代表不同的信息&#xff1a; 第1、2位数字表示省份代码。 第3、4位数字表示城市代码。 第5、6位数字表示区县代码。 第7至14位数字表示出生年、月、日&#xff08;其中7、8、9、10位是年&#xff0c;11、12…

整合SpringSecurity+JWT实现登录认证

一、关于 SpringSecurity 在 Spring Boot 出现之前&#xff0c;SpringSecurity 的使用场景是被另外一个安全管理框架 Shiro 牢牢霸占的&#xff0c;因为相对于 SpringSecurity 来说&#xff0c;SSM 中整合 Shiro 更加轻量级。Spring Boot 出现后&#xff0c;使这一情况情况大有…

python实战之PyQt5桌面软件

一. 演示效果 二. 准备工作 1. 使用pip 下载所需包 pyqt5 2. 下载可视化UI工具 QT Designer 链接&#xff1a;https://pan.baidu.com/s/1ic4S3ocEF90Y4L1GqYHPPA?pwdywct 提取码&#xff1a;ywct 3. 可视化UI工具汉化 把上面的链接打开, 里面有安装和汉化包, 前面的路径还要看…

基于SSM学生信息管理系统

采用技术 基于SSM学生信息管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 总体功能设计 登录页面 后台首页 学生信息页面 添加学生用户 编辑…

Java代码混淆技术最佳实践与案例分享

摘要 本文探讨了代码混淆在保护Java代码安全性和知识产权方面的重要意义。通过混淆技术&#xff0c;可以有效防止代码被反编译、逆向工程或恶意篡改&#xff0c;提高代码的安全性。常见的Java代码混淆工具如IPAGuard、Allatori、DashO、Zelix KlassMaster和yGuard等&#xff0…

单链表算法库

singlelist.cpp #include "singlelist.h"/************************************************** ①函数名: CreatList_Head 功 能: 头插法建立单链表 参 数: (1)LinkList *&L: 传入的单链表指针地址(2)ElemType Array_used[]:要用来建表的数组(3)int Array_nu…

win 11环境配置 之 python(cmd 输入 python --version 输出为空)

当我安装好python后&#xff0c;在 cmd 终端输入 python 和 python --version 均无任何输出时&#xff0c;就知道有问题。 在 vscode 下载好 python插件后&#xff0c;编写demo文件&#xff0c;可以执行成功。 因此得出原因是 win 环境变量配置有问题 具体错误问题&#xff1a;…

BabySQL【2019极客大挑战】

知识点&#xff1a; 功能分析 登录界面一般是 where username and password 可以从username出手&#xff0c;注释掉and语句单引号闭合绕过 通过测试和报错信息发现是一个单引号读取输入可以单引号闭合绕过关键字过滤 or and 过滤 || &&替换双写绕过select from wher…

飞凌嵌入式即将亮相德国纽伦堡「Embedded World 2024」

2024年德国纽伦堡嵌入式展览会&#xff08;Embedded World 2024&#xff09;将于4月9日~4月11日盛大开幕&#xff0c;本届展会将展示最新的电子技术与应用&#xff0c;涵盖了半导体、嵌入式系统、电源、电池、测试仪器、智能制造、电子设计自动化等众多领域&#xff0c;并将汇集…

Aigtek:电压放大器对参数的要求是什么

电压放大器是一种用于增大输入信号幅度的电子设备&#xff0c;它在各种应用中发挥着重要的作用。为了确保电压放大器的性能和可靠性&#xff0c;对其参数有一定的要求。下面安泰电子将介绍电压放大器的几个关键参数&#xff0c;包括增益、带宽、输入/输出阻抗和噪声等&#xff…

Win10 搭建FTP存储服务器站点【超详细教程】

目录 第一步&#xff1a;打开控制面板>程序 第二步&#xff1a;win10左下角搜索IIS并打开 第三步&#xff1a;右键网站&#xff0c;选择添加FTP站点 第四步&#xff1a;添加FTP站点名称 第五步&#xff1a;添加IP地址和端口 第六步&#xff1a;身份验证与授权信息 第…

系统架构图怎么画

画架构图是架构师的一门必修功课。 对于架构图是什么这个问题&#xff0c;我们可以按以下等式进行概括&#xff1a; 架构图 架构的表达 架构在不同抽象角度和不同抽象层次的表达&#xff0c;这是一个自然而然的过程。 不是先有图再有业务流程、系统设计和领域模型等&#…

LLM2LLM: Boosting LLMs with Novel Iterative Data Enhancement

LLM2LLM: Boosting LLMs with Novel Iterative Data Enhancement 相关链接&#xff1a;arXiv GitHub 关键字&#xff1a;LLM、Data Augmentation、Fine-tuning、NLP、Low-data Regime 摘要 预训练的大型语言模型&#xff08;LLMs&#xff09;目前是解决绝大多数自然语言处理任…

助力低碳出行 | 基于ACM32 MCU的电动滑板车方案

前言 随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成…

Uibot6.0 (RPA财务机器人师资培训第5天 ) 报销汇总机器人案例实战

训练网站&#xff1a;泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https…

SAP BTP云上一个JVM与DB Connection纠缠的案例

前言 最近在CF (Cloud Foundry) 云平台上遇到一个比较经典的案例。因为牵扯到JVM &#xff08;app进程&#xff09;与数据库连接两大块&#xff0c;稍有不慎&#xff0c;很容易引起不快。 在云环境下&#xff0c;有时候相互扯皮的事蛮多。如果是DB的问题&#xff0c;就会找DB…

day72Html

常用标签&#xff1a; 分类&#xff1a; 块级标签&#xff1a;独立成行 行级标签&#xff1a;不独立成行&#xff0c;同一行可放多个行级标 注意网页显示时&#xff0c;忽略空白字符,(回车符&#xff0c;空格&#xff0c;tab制表符&#xff09; 一&#xff09;块级标签&#xf…

STM32/GD32的以太网DMA描述符

继续梳理以太网的DMA描述符。 以太网DAM描述符的结构 有两种结构&#xff0c;链式结构和环形结构。 常用的是链式结构。 标准库中&#xff0c;关于DMA描述符的数据结构 以gd32f4xx_enet.c为例。 先说发送描述符。 系统分配了5个发送描述符。每个描述符对应的缓冲区大小为152…

基于双vip+GTID的半同步主从复制集群项目(MySQL集群)

项目标题&#xff1a;基于keepalivedGTID的半同步主从复制MySQL集群 准备七台机器&#xff0c;其中有四台时MySQL服务器&#xff0c;搭建主从复制的集群&#xff0c;一个master&#xff0c;2个slave服务器&#xff0c;一个延迟备份服务器。同时延迟备份服务器也可以充当异地备…