【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.hqwc.cn/news/576514.html

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

相关文章

如何通过vscode连接到wsl

下载wsl扩展 远程连接模式

EDA 全加器设计及例化语句应用

文章目录 前言一、全加器是什么&#xff1f;二、使用步骤1.半加器2.全加器1.新建一个全加器工程2.添加半加器的.v文件到全加器工程中3.新建全加器.v文件&#xff0c;写程序&#xff0c;调用半加器.v文件 完成例化 三、仿真效果总结 前言 提示&#xff1a;这里可以添加本文要记…

【机器学习】数据探索(Data Exploration)---数据质量和数据特征分析

一、引言 在机器学习项目中&#xff0c;数据探索是至关重要的一步。它不仅是模型构建的基础&#xff0c;还是确保模型性能稳定、预测准确的关键。数据探索的过程中&#xff0c;数据质量和数据特征分析占据了核心地位。数据质量直接关系到模型能否从数据中提取有效信息&#xff…

Vue挂载全局方法

简介&#xff1a;有时候&#xff0c;频繁调用的函数&#xff0c;我们需要把它挂载在全局的vue原型上&#xff0c;方便调用&#xff0c;具体怎么操作&#xff0c;这里来记录一下。 一、这里以本地存储的方法为例 var localStorage window.localStorage; const db {/** * 更新…

map与set容器常见操作详解(含示例代码及注意事项)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

hcip实验3——gre配置实验

实验拓扑&#xff1a; 实验内容&#xff1a; PC1; PC2: R1配置&#xff1a; [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]ip add 100.1.1.1 24 [Huawei-GigabitEthernet0/0/1]q [Huawei]sys […

Linux根据时间删除文件或目录

《liunx根据时间删除文件》和 《Linux 根据时间删除文件或者目录》已经讲述了根据时间删除文件或目录的方法。 下面我做一些补充&#xff0c;讲述一个具体例子。以删除/home目录下的文件为例。 首先通过命令&#xff1a; ls -l --time-style"%Y-%m-%d %H:%M:%S"…

【Linux】nmcli命令详解(文末送书)

目录 一、概述 二、常用参数使用 2.1 nmcli networking 1.显示NM是否接管网络 2.查看网络连接状态 3.开/关网络连接 2.2 general ​编辑 1.显示系统网络状态 2.显示主机名 3.更改主机名 2.3 nmcli connection ​编辑1.显示所有网络连接 2.显示某个网卡的详细信息…

基于微信小程序的民宿短租系统设计与实现(论文+源码)_kaic

摘 要 随着社会的发展&#xff0c;出差、旅游成为常态&#xff0c;也就造成民宿短租市场的兴起。人们新到陌生的环境里找民宿一般都是通过中介。中介虽然可以快速找到合适的民宿但会收取大量的中介费用&#xff0c;这对刚到新环境里的人们来说是一笔大的资金支出。也有一些人通…

【算法笔记】LeetCode_86 分隔链表

LeetCode_86 分隔链表 LeetCode_86 分隔链表 题目描述 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff…

采用苹果应用商店上架工具的经验与案例研究

摘要 移动应用app上架是开发者关注的重要环节&#xff0c;但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作&#xff0c;各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用&#xff0c;最终指出合理使用工具的重要性。 引言 移动应…

Yarn简介及Windows安装与使用指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…