【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.rhkb.cn/news/294926.html

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

相关文章

C++bitset类型

bitset类型 我们介绍了将整型运算对象当作二进制位集合处理的一些内置运算符。 标准库还定义了bitset类&#xff0c;使得位运算的使用更为容易&#xff0c;并且能够处理超过最长整型类型大小的位集合。bitset类定义在头文件bitset中。 定义和初始化bitset bitset类是一个类模…

朵米3.5客服系统源码,附带系统搭建教程

朵米客服系统是一款全功能的客户服务解决方案&#xff0c;提供多渠道支持&#xff08;如在线聊天、邮件、电话等&#xff09;&#xff0c;帮助企业建立与客户的实时互动。该系统具有智能分流功能&#xff0c;可以快速将客户请求分配给适当的客服人员&#xff0c;提高工作效率。…

协程库-锁类-实现线程互斥同步

mutex.h&#xff1a;信号量&#xff0c;互斥锁&#xff0c;读写锁&#xff0c;范围锁模板&#xff0c;自旋锁&#xff0c;原子锁 锁 **锁不能进行拷贝操作&#xff1a;**锁是用于管理多线程并发访问共享资源的同步原语。这些锁包括互斥锁&#xff08;mutex&#xff09;、读写锁…

【攻防世界】file_include (PHP伪协议+过滤器)

打开题目环境&#xff1a; 进行PHP代码审计&#xff0c;发现这是一个文件包含漏洞。 我们尝试利用PHP伪协议中的 php://filter来读取 check.php 中的内容。 构造payload 并提交&#xff1a; 发现payload被过滤掉了&#xff0c;我们就需要尝试使用不同的转换器。 PHP各类转换…

【面经】2023年软件测试面试题大全(持续更新)附答案

前阵子一位读者告诉我&#xff0c;某位大厂HR给他发了我之前做的面试题答案合集。 这个消息让我开心了一整天&#x1f602;&#xff0c;因为这说明我之前做的面试题系列真的能帮助到部分测试同学&#xff0c;也算是侧面得到了一种认可吧。 坚持可是我们程序员家族的优良传统&a…

未来购物新篇章:臻奶惠无人新零售

未来购物新篇章&#xff1a;臻奶惠无人新零售 随着科技的不断进步和消费者购物习惯的变化&#xff0c;无人新零售已经成为零售行业的一大趋势&#xff0c;它不仅重新定义了购物体验&#xff0c;也为零售行业带来了前所未有的变革。无人新零售&#xff0c;一种融合了AI技术、物…

Java程序运行的问题——异常

什么是异常? Java程序在运行时出现的问题就叫异常 jdk中将异常一新封装成了一个个的类&#xff0c;当出现问题时&#xff0c;就会创建异常对象&#xff0c;抛出异常信息&#xff08;问题原因、位置&#xff09; 1.异常 1.1异常的继承体系 Throwable 是所有错误&#xff08;…

Python控制浏览器——selenium模块

Python控制浏览器——selenium模块 目录 Python控制浏览器——selenium模块准备工作【1】安装selenium【2】安装浏览器驱动【3】测试驱动&#xff08;作者是Edge&#xff09; 导航和操作窗口导航返回前进刷新最大化窗口切换选项卡 查找和操作元素8种基本By定位方式[1]ID[2]Name…

关系(二)利用python绘制热图

关系&#xff08;二&#xff09;利用python绘制热图 热图 &#xff08;Heatmap&#xff09;简介 热图适用于显示多个变量之间的差异&#xff0c;通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…

一个 hipsolver 特征值示例

1&#xff0c;原理 通过雅可比旋转&#xff0c;对对称矩阵计算特征值和特征向量&#xff1b; 通过初等正交变换&#xff0c;每次把其中一个非主对角元素消成零&#xff0c;最终只剩主对角线非零元素为特征值&#xff0c;同时把初等变换累积下来&#xff0c;构成特征向量。 2&a…

CAS(Compare And Swap)

目录 CAS概念 乐观锁与悲观锁 ABA问题 Unsafe类 ​编辑 原子类 基本类型原子类 原子引用类 原子数组 原子更新器类 原子累加器 CAS概念 CAS是Compare And Swap的缩写&#xff0c;中文翻译成&#xff1a;比较并交换&#xff0c;实现无锁并发时常用到的一种技术。它一…

element plus的el-image图片发布到nginx不显示

问题&#xff1a; <el-image alt""src"/img/month-b.png" class"card-icon"style"width: 89px;height: 89px;right: -7px;top: -5px;"/> 部署到nginx二级路由访问地址是&#xff1a; http://192.168.1.207/divided/# 这时候使用…

总结jvm中GC机制(垃圾回收)

前言 本篇博客博主将介绍jvm中的GC机制&#xff0c;坐好板凳发车啦~~ 一.GC相关 1.1回收栈内存 对于虚拟机栈&#xff0c;本地方法栈这部分区域而言&#xff0c;其生命周期与相关线程相关&#xff0c;随线程而生&#xff0c;随线程而灭。并且这三个区域的内存分配与回收具有…

OpenHarmony:全流程讲解如何编写ADC平台驱动以及应用程序

ADC&#xff08;Analog to Digital Converter&#xff09;&#xff0c;即模拟-数字转换器&#xff0c;可将模拟信号转换成对应的数字信号&#xff0c;便于存储与计算等操作。除电源线和地线之外&#xff0c;ADC只需要1根线与被测量的设备进行连接。 一、案例简介 该程序是基于…

github本地仓库push到远程仓库

1.从远程仓库clone到本地 2.生成SSH秘钥&#xff0c;为push做准备 在Ubuntu命令行输入一下内容 [rootlocalhost ~]# ssh-keygen -t rsa < 建立密钥对&#xff0c;-t代表类型&#xff0c;有RSA和DSA两种 Generating public/private rsa key pair. Enter file in whi…

Synchronized锁升级过程

无锁-->偏向锁---> 轻量级锁---->重量级锁 ①、从无锁到偏向锁&#xff1a; 当一个线程首次访问同步块时&#xff0c;如果此对象无锁状态且偏向锁未被禁用&#xff0c;JVM 会将该对象头的锁标记改为偏向锁状态&#xff0c;并记录下当前线程的 ID。此时&#xff0c;对…

Java进阶-反射的详解与应用

本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力&#xff0c;包括在运行时动态获取类信息、操作对象字段和方法的能力。随后&#xff0c;通过具体代码示例&#xff0c;展示了如何利用反射进行字段访问、方法…

3.5网安学习第三阶段第五周回顾(个人学习记录使用)

本周重点 ①SSRF服务器端请求伪造 ②序列化和反序列化 ③Vaudit代码审计 本周主要内容 ①SSRF服务器端请求伪造 一、概述 SSRF: server site request forgery (服务器端请求伪造)。 SSR: 服务端请求&#xff0c;A服务器通过函数向B服务器发送请求。 SSRF发生的前提条件…

Linux:入门篇

文章目录 前言1. Linuxd的安装环境2.Linux的简单介绍2.1 新建目录2.2 新建文件 3.指令到底是什么&#xff1f;4.shell命令以及运行原理5.总结 前言 很多人对于Linux的学习总是感觉无法下手&#xff0c;不知道从何开始学习&#xff0c;相信这篇文章将会为你提供一个清晰的思路。…

高精度算法(加、减、乘、除,使用c++实现)

一、概念 在我们进行计算的过程中&#xff0c;经常会遇到几十位&#xff0c;甚至几百位的数字的计算问题&#xff0c;也有可能会遇到小数点后几十位&#xff0c;几百位的情况&#xff0c;而我们面对这样的情况下&#xff0c; 和 的数据范围显然是不够使用的了。因此这时&am…