【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.mzph.cn/news/783736.shtml

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

相关文章

springboot论坛管理系统

论坛管理系统 摘要&#xff1a; 在社会快速发展的影响下&#xff0c;论坛管理系统继续发展&#xff0c;使论坛管理系统的管理和运营比过去十年更加信息化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上论坛管理系统是一项十分重要并且有价值的事情。对于传统的论…

一篇讲明白 Hadoop 生态的三大部件

文章目录 每日一句正能量前言01 HDFS02 Yarn03 Hive04 HBase05 Spark及Spark Streaming关于作者推荐理由后记赠书活动 每日一句正能量 黎明时怀着飞扬的心醒来&#xff0c;致谢爱的又一天&#xff0c;正午时沉醉于爱的狂喜中休憩&#xff0c;黄昏时带着感恩归家&#xff0c;然后…

【Linux】进程实践项目 —— 自主shell编写

送给大家一句话&#xff1a; 不管前方的路有多苦&#xff0c;只要走的方向正确&#xff0c;不管多么崎岖不平&#xff0c;都比站在原地更接近幸福。 —— 宫崎骏《千与千寻》 自主shell命令编写 1 前言2 项目实现2.1 创建命令行2.2 获取命令2.3 分割命令2.4 运行命令 3 源代码…

非NVIDIA平台下的CUDA的替代方案OpenCL,第一步如何获取PlatformInfo、DeviceInfo

非NVIDIA平台下的CUDA的替代方案OpenCL&#xff0c;第一步如何获取PlatformInfo、DeviceInfo 介绍 当谈到高性能计算&#xff0c;NVIDIA的CUDA框架无疑是一个强大的工具。OpenC&#xff08;Open Computing Language&#xff09;是一个更为通用的解决方案&#xff0c;或者你使用…

Vscode连接远程服务器中的docker容器进行开发

0.预安装 1.本地windows或其他环境中安装了Vscode&#xff0c;Vscode中安装了Remote-SSH拓展&#xff08;用于利用SSH连接docker容器&#xff09; 2.远程服务器中安装了docker&#xff0c;并且拉取了自己需要的镜像 3.有root权限&#xff0c;能使用sudo命令 1. 在服务器端启…

javaWeb项目-学生考勤管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JAVA技术 JavaSc…

蓝桥杯省赛刷题——题目 2656:刷题统计

刷题统计OJ链接&#xff1a;蓝桥杯2022年第十三届省赛真题-刷题统计 - C语言网 (dotcpp.com) 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几…

MS Edge浏览器坏了?网页播放视频的速度不对

前言 小白是MS Edge浏览器的重度用户。电脑上必须有的两个浏览器&#xff1a;Google Chrome和Microsoft Edge。 前段时间小白在使用MS Edge的时候出了问题&#xff1a;播放视频或者音频的时候总是被莫名其妙加速或者减速&#xff0c;类似于播放视频时候的0.5x或者2.0x。 当时…

C++入门知识详细讲解

C入门知识详细讲解 1. C简介1.1 什么是C1.2 C的发展史1.3. C的重要性1.3.1 语言的使用广泛度1.3.2 在工作领域 2. C基本语法知识2.1. C关键字(C98)2.2. 命名空间2.2 命名空间使用2.2 命名空间使用 2.3. C输入&输出2.4. 缺省参数2.4.1 缺省参数概念2.4.2 缺省参数分类 2.5. …

Abaqus周期性边界代表体单元Random Sphere RVE 3D (Mesh)插件

插件介绍 Random Sphere RVE 3D (Mesh) - AbyssFish 插件可在Abaqus生成三维具备周期性边界条件(Periodic Boundary Conditions, PBC)的随机球体骨料及骨料-水泥界面过渡区(Interfacial Transition Zone, ITZ)模型。即采用周期性代表性体积单元法(Periodic Representative Vol…

python distribute是什么

Python的包管理工具常见的有easy_install, setuptools, 还有pip, distribute&#xff0c;那麽这几个工具有什么关系呢&#xff0c;看一下下面这个图就明白了&#xff1a; 可以看到distribute是setuptools的替代方案&#xff0c;pip是easy_install的替代方案。 Distribute提供一…

【QT学习】2.补充:connect中的lambda表达式

一.简单实例&#xff1a; 1.实例要求 点击按钮&#xff0c;实现 >o<与#-#的转换。 2.步骤 补充&#xff1a;​​​​​​​ 1.如果我想在lambda中修改数据&#xff0c;怎么办&#xff1f; 写上mutable就行。

vue基础教程(5)——构建项目级登录页

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、创建首页二、登录页代码讲解三、对应的vue知识点&#xff1a;四、附件-各文件代码总结 前言 前面我们已经把vue自带的页面删除&#xff0c;也搭建了最简单的router路由&#xff0c;下面就可以真正开发我们自己的项目…

【独立开发前线】Vol.29 专注于电子邮件签名,也可以依靠SEO年入70万美元

今天要给大家分享的案例是MySignature&#xff0c;一个专注于电子邮件签名的产品&#xff1b; 它的官网是&#xff1a;MySignature: Free Email Signature Generator 提到电子邮件签名&#xff0c;很多人想到的肯定是“那不是电子邮件结尾的几行图文介绍吗&#xff0c;这也能做…

ZNC3罗德与施瓦茨ZNC3网络分析仪

181/2461/8938产品概述&#xff1a; 罗德与施瓦茨 ZNC3 网络分析仪的工作频率范围为 9 kHz 至 3 GHz&#xff0c;面向移动无线电和电子产品行业的应用。它具有双向测试装置&#xff0c;用于测量有源和无源 DUT 的所有四个 S 参数。此外&#xff0c;它还提供适合开发和生产中各…

最新2024年增强现实(AR)营销指南(完整版)

AR营销是新的最好的东西&#xff0c;就像元宇宙和VR营销一样。利用AR技术开展营销活动可以带来广泛的利润优势。更不用说&#xff0c;客户也喜欢AR营销&#xff01; 如果企业使用AR&#xff0c;71%的买家会更多地购物。40%的购物者准备在他们可以在AR定制的产品上花更多的钱。…

【Linux】详解文件系统以及周边知识

一、磁盘的基本知识 磁盘中可以被划分成一个一个的环&#xff0c;每个环都是一个磁道。每个磁道又可以被均分成一个一个的扇区&#xff0c;扇区是磁盘IO的基本单位&#xff08;想要修改扇区中的一个比特位就必须把该扇区的全部比特位都加载到内存中&#xff09;。磁盘中的盘面&…

【Linux】详解软硬链接

一、软硬链接的建立方法 1.1软链接的建立 假设在当前目录下有一个test.txt文件&#xff0c;要对其建立软链接&#xff0c;做法如下&#xff1a; ln就是link的意思&#xff0c;-s表示软链接&#xff0c;test.txt要建立软链接的文件名&#xff0c;后面跟上要建立的软链接文件名…

魔改一个过游戏保护的CE

csdn审核不通过 网易云课堂有配套的免费视频 int0x3 - 主页 文章都传到github了 Notes/外挂/魔改CE at master MrXiao7/Notes GitHub 为什么要编译自己的CE 在游戏逆向的过程中&#xff0c;很多游戏有保护&#xff0c;我们运行原版CE的时候会被检测到 比如我们开着CE运…

MySQL数据库MHA高可用集群

前言 MySQL 数据库 MHA&#xff08;Master High Availability&#xff09;高可用集群是一种用于提高 MySQL 数据库可用性的解决方案。它通过自动故障切换和监控来确保数据库系统在主服务器发生故障时能够快速切换到备用服务器&#xff1b;在 MHA 高可用集群中&#xff0c;Mast…