【二十】【QT开发应用】listwidget右键菜单和删除item

创建项目,添加资源文件

在这里插入图片描述
在项目文件夹中创建resources资源文件夹。
在这里插入图片描述
在vs中打开qrc文件,选择添加资源文件。
在这里插入图片描述
选择我们resources资源文件中的所有文件作为资源文件。
在这里插入图片描述
最后不要忘记点击保存。
在这里插入图片描述

向ListWidget控件添加item

在这里插入图片描述

右键菜单

在.h文件中添加QMenu头文件,右键菜单初始化函数,以及槽函数弹出右键菜单,和右键菜单对应的指针。

在这里插入图片描述
编写还初始化函数和槽函数。
在这里插入图片描述
调用初始化函数和连接信号和信号槽。
在这里插入图片描述
在这里插入图片描述

连接菜单中的信号和槽函数。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

复盘

向listwidget控件添加item项

    QListWidgetItem* pItem1 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/kits.png"), u8"Kits");
    QListWidgetItem* pItem2 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/env.png"), u8"环境");
    QListWidgetItem* pItem3 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/editor.png"), u8"编辑器");
    QListWidgetItem* pItem4 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/vim.png"), u8"Fakevim");
    QListWidgetItem* pItem5 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/help.png"), u8"帮助");

    ui.listWidget->addItem(pItem1);
    ui.listWidget->addItem(pItem2);
    ui.listWidget->addItem(pItem3);
    ui.listWidget->addItem(pItem4);
    ui.listWidget->addItem(pItem5);

这段代码使用了Qt框架中的QListWidgetItem类来向一个列表控件中添加带图标和文字的项目。具体解释如下:

  1. QListWidgetItem: 每一个QListWidgetItem对象代表一个列表项,可以包含图标和文本。
  2. QIcon: QIcon类用来加载和表示图标,图标的路径是从资源文件中加载的(":/demo12_listwidget/resources/..."是指向Qt资源系统中的路径)。
  3. u8"…": 这个前缀表示字符串是以UTF-8编码的。这种编码方式可以用于处理多语言文本(如中文的"环境"和"帮助")。
QListWidgetItem* pItem1 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/kits.png"), u8"Kits");
  • 创建了一个新的QListWidgetItem对象,带有一个图标(路径为resources/kits.png)和文本“Kits”。
QListWidgetItem* pItem2 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/env.png"), u8"环境");
  • 创建了另一个QListWidgetItem对象,图标来自resources/env.png,文本为“环境”(中文)。
QListWidgetItem* pItem3 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/editor.png"), u8"编辑器");
  • 再次创建一个QListWidgetItem对象,图标为resources/editor.png,文本是“编辑器”。
QListWidgetItem* pItem4 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/vim.png"), u8"Fakevim");
  • 创建了一个图标为resources/vim.png,文本为“Fakevim”的项目。
QListWidgetItem* pItem5 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/help.png"), u8"帮助");
  • 创建了一个带有resources/help.png图标和“帮助”文本的列表项。
ui.listWidget->addItem(pItem1);
ui.listWidget->addItem(pItem2);
ui.listWidget->addItem(pItem3);
ui.listWidget->addItem(pItem4);
ui.listWidget->addItem(pItem5);
  • 依次将上面创建的5个QListWidgetItem添加到一个名为listWidgetQListWidget控件中。这个控件在用户界面中用来显示这些带图标和文本的列表项。

初始化函数

void demo12_listwidget::initRightMenu() {

	m_pRightMenu = new QMenu(this);

	QAction* pAc1 = new QAction(u8"动作1", this);
	QAction* pAc2 = new QAction(u8"动作2", this);
	QAction* pAc3 = new QAction(u8"动作3", this);
	QAction* pAc4 = new QAction(u8"删除", this);

	m_pRightMenu->addAction(pAc1);
	m_pRightMenu->addAction(pAc2);
	m_pRightMenu->addAction(pAc3);
	m_pRightMenu->addAction(pAc4);


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

    connect(pAc4, &QAction::triggered, [=] {
		QListWidgetItem* item = ui.listWidget->currentItem();
		ui.listWidget->removeItemWidget(item);
		delete item;
        });
}

这段代码的作用是在Qt应用程序中为一个列表控件创建并初始化右键菜单,同时为其中的几个动作(QAction)设置相应的处理逻辑。

void demo12_listwidget::initRightMenu() {
    m_pRightMenu = new QMenu(this);
  • 定义了一个名为initRightMenu的成员函数,用来初始化右键菜单。
  • m_pRightMenu是一个指向QMenu对象的指针,表示右键菜单,并通过new QMenu(this)创建了新的菜单对象,this表示当前窗口作为父对象,确保内存管理。
    QAction* pAc1 = new QAction(u8"动作1", this);
    QAction* pAc2 = new QAction(u8"动作2", this);
    QAction* pAc3 = new QAction(u8"动作3", this);
    QAction* pAc4 = new QAction(u8"删除", this);
  • 这里创建了四个QAction对象,分别对应右键菜单中的四个选项。u8"动作1"等表示菜单项的文本,其中前三项为通用动作,第四项"删除"是一个专门用于删除选项的动作。this表示这些QAction的父对象是当前窗口。
    m_pRightMenu->addAction(pAc1);
    m_pRightMenu->addAction(pAc2);
    m_pRightMenu->addAction(pAc3);
    m_pRightMenu->addAction(pAc4);
  • 使用addAction函数将四个QAction对象添加到右键菜单m_pRightMenu中。这会让这些动作在右键点击时出现在菜单中。

信号与槽连接:

    connect(pAc1, &QAction::triggered, [=] {
        QMessageBox::information(this, "title", "ac1");
    });
  • connect函数用于连接信号与槽。当pAc1triggered信号被触发(即当用户点击“动作1”时),会执行匿名lambda函数。在该函数内,QMessageBox::information弹出一个消息框,显示标题为"title",内容为"ac1"的信息。
    connect(pAc4, &QAction::triggered, [=] {
        QListWidgetItem* item = ui.listWidget->currentItem();
        ui.listWidget->removeItemWidget(item);
        delete item;
    });
  • 当用户点击“删除”(pAc4)菜单项时,会触发这个匿名函数。
  • ui.listWidget->currentItem():获取当前选中的列表项。
  • ui.listWidget->removeItemWidget(item):将该项目从列表控件中移除。
  • delete item:从内存中删除该项目,防止内存泄漏。

弹出右键菜单函数

void demo12_listwidget::on_PopupRightMenu(const QPoint& pos) {
    QListWidgetItem* pItem = ui.listWidget->itemAt(pos);
	if (!pItem) return;


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

这段代码的功能是当用户在QListWidget中右键单击时,弹出一个右键菜单。

void demo12_listwidget::on_PopupRightMenu(const QPoint& pos) {
  • 这是一个名为on_PopupRightMenu的成员函数,接收一个QPoint类型的参数pos,表示鼠标点击的相对位置。
  • 该函数是一个槽函数,用于响应右键单击的信号,从而在指定位置弹出右键菜单。
    QListWidgetItem* pItem = ui.listWidget->itemAt(pos);
  • ui.listWidget->itemAt(pos):使用这个函数从listWidget中获取用户单击位置的QListWidgetItem对象。
  • pos是鼠标单击的位置,itemAt根据这个位置返回对应的列表项。如果用户点击的地方没有列表项,那么pItem将会是nullptr
    if (!pItem) return;
  • 这里进行空指针检查。如果在用户点击的位置没有任何列表项(即pItem == nullptr),则函数直接返回,不进行后续的菜单弹出操作。
    m_pRightMenu->exec(QCursor::pos());
  • 如果用户点击的位置有对应的列表项,则执行这行代码来弹出右键菜单。
  • m_pRightMenu->exec()用于显示菜单,QCursor::pos()返回当前鼠标的全局屏幕坐标,确保菜单在鼠标所在的位置弹出。

设置菜单策略,连接弹出菜单的信号和槽函数

    ui.listWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    connect(ui.listWidget, &QListWidget::customContextMenuRequested, this, &demo12_listwidget::on_PopupRightMenu);

这段代码的作用是为QListWidget控件设置自定义的右键菜单触发机制,并连接相应的槽函数,以便在用户右键单击时弹出菜单。

ui.listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
  • 这行代码为listWidget设置了上下文菜单策略。
  • Qt::CustomContextMenu:表示使用自定义的上下文菜单。这意味着当用户右键点击时,不会显示默认的上下文菜单,而是触发一个信号,开发者可以捕获这个信号并定义自定义的菜单行为。
connect(ui.listWidget, &QListWidget::customContextMenuRequested, this, &demo12_listwidget::on_PopupRightMenu);
  • connect函数将listWidgetcustomContextMenuRequested信号与demo12_listwidget::on_PopupRightMenu槽函数连接起来。
    • customContextMenuRequested信号:这是当用户右键单击时,QListWidget发出的信号,传递右键单击的相对位置QPoint
    • 槽函数on_PopupRightMenu:这是一个自定义的函数,用于在指定位置弹出右键菜单(该函数在之前的代码中已定义)。
    • 这样,当用户在listWidget中右键点击时,on_PopupRightMenu函数会被触发,菜单会弹出。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

java项目之编程训练系统源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的编程训练系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 编程训练系统的主要使用者管…

结合人工智能,大数据,物联网等主流技术实现业务流程的闭环整合的名厨亮灶开源了

明厨亮灶视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。AI技术可以24小时…

1.5 计算机网络的分层结构

欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言1 分层设计2 网络体系结构2.1 基本概述2.2 常见的三种网络体系结构 3 各层之间的关系3.1 水平关系3.2 垂直关系 4 数据传输过程4.1 水平视角4.2 垂直视角 前言 在当今数字…

uniapp H5 打开地图 并选中标记点

uniapp H5 打开地图 并选中标记点 先上代码 //打开地图 显示景区位置openMap() {// 支付宝// #ifdef MP-ALIPAYmy.openLocation({longitude: Number(this.detailObj.longitude), // 经度latitude: Number(this.detailObj.latitude), // 纬度name: this.detailObj.scenicName, …

CertiK因发现Apple Vision Pro眼动追踪技术漏洞,第6次获苹果认可

​2024年9月20日,头部Web3.0安全机构CertiK自豪地宣布,CertiK的工程师因发现Apple Vision Pro MR(混合现实)头显设备中的关键漏洞而获得Apple公司认可,这已经是Apple公司第六次公开发布对CertiK的致谢,Cert…

文件格式转换:EXCEL和CSV文件格式互相转换

目录 1.EXCEl和CSV文件格式互相转换1.1首先安装所需的Python包1.2excel转换为csv代码如下:1.3csv转换为excel代码如下: 由于excel文件在数学建模数据处理当中的局限性,我们通常把excel文件转换为csv文件来处理,下面是相关的代码&a…

IDEA配置全局的maven环境

1、关闭掉所有打开的项目,然后点击All settings 2、配置maven home path、user setting file、local repository。 3、配置JRE的版本 4、配置字节码版本

【第十三章:Sentosa_DSML社区版-机器学习聚类】

目录 【第十三章:Sentosa_DSML社区版-机器学习聚类】 13.1 KMeans聚类 13.2 二分KMeans聚类 13.3 高斯混合聚类 13.4 模糊C均值聚类 13.5 Canopy聚类 13.6 Canopy-KMeans聚类 13.7 文档主题生成模型聚类 13.8 谱聚类 【第十三章:Sentosa_DSML社…

聊天组件 Vue3-beautiful-chat 插槽

前言 Vue3-beautiful-chat 组件有四个插槽可以定制 一、user-avatar(头像) 首先是头像插槽,我们可以直接在 <beautiful-chat></beautiful-chat> 中间使用; 作用: 我们可以在用户头像上添加自定义样式,比如添加节日边框、可以使用首字母作为头像。。。 …

由于安全风险,安全领导者考虑禁止人工智能编码

安全团队与开发团队之间的紧张关系 83% 的安全领导者表示&#xff0c;他们的开发人员目前使用人工智能来生成代码&#xff0c;57% 的人表示这已成为一种常见做法。 然而&#xff0c;72% 的人认为他们别无选择&#xff0c;只能允许开发人员使用人工智能来保持竞争力&#xff0…

优优嗨聚集团:引领互联网服务新篇章

在当今这个日新月异的互联网时代&#xff0c;企业之间的竞争愈发激烈&#xff0c;如何高效地运营线上业务成为了众多商家关注的焦点。在这一背景下&#xff0c;四川优优嗨聚集团凭借其卓越的服务质量、创新的技术解决方案和强大的品牌影响力&#xff0c;逐渐成为了众多商家信赖…

vscode 配置rust格式化的正确方法

vscode 配置rust格式化的正确方法&#xff1a; 在settings.json里输入&#xff1a; "[rust]": {"editor.defaultFormatter": "rust-lang.rust-analyzer","editor.formatOnSave": true}

CUDA并行架构

一、CUDA简介 CUDA(Compute Unified Device Architecture)是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU(Graphics Processing Unit)能够对复杂的计算问题做性能速度优化。 二、串并行模式 高性能计算的关键是利用多核处理器进行并行计算。 串行模式&#…

Python 中的 typing 模块常见用法

typing 模块是 Python 提供的一个标准库&#xff0c;主要用于为函数、变量和类定义类型提示&#xff08;Type Hints&#xff09;&#xff0c;从而提高代码的可读性和类型安全性。虽然 Python 是动态类型语言&#xff0c;但通过 typing 模块&#xff0c;开发者可以明确指定变量和…

【2024研赛】【华为杯E题】2024 年研究生数学建模比赛思路、代码、论文助攻

思路将在名片下群聊分享 高速公路应急车道紧急启用模型 高速公路拥堵现象的原因众多&#xff0c;除了交通事故外&#xff0c;最典型的就是部分路段出现瓶颈现象&#xff0c;主要原因是车辆汇聚&#xff0c;而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点&#xff0…

Scrapy爬虫实战——某瓣250

# 按照我个人的习惯&#xff0c;在一些需要较多的包作为基础支撑的项目里&#xff0c;习惯使用虚拟环境&#xff0c;因为这样能极大程度的减少出现依赖冲突的问题。依赖冲突就比如A、B、C三个库&#xff0c;A和B同时依赖于C&#xff0c;但是A需要的C库版本大于N&#xff0c;而B…

一文说清楚ETL与Kafka如何实现集成

ETL与Kafka为何需要集成? 随着企业对实时流数据的处理要求越来越高&#xff0c;很多企业都把实时流数(日志、实时CDC采集数据、设备数据…)先推入到kafka中&#xff0c;再通过ETL对kafka中的数据进行消费通过ETL强大的数据的转换、清洗功能来进行数据的集成与分发。 实时数据…

CefSharp_Vue交互(Element UI)_WinFormWeb应用---设置应用透明度(含示例代码)

一、界面预览 1.1 设置透明(整个页面透明80%示例) 限制输入值:10-100(数字太小会不好看见) 1.2 vue标题栏 //注册类与js调用 (async function(

11年计算机考研408-数据结构

设执行了k次。 解析&#xff1a; d要第一个出&#xff0c;那么abc先入栈&#xff0c;d入栈然后再出栈&#xff0c;这前面是一个固定的流程&#xff0c;后面就很灵活了&#xff0c;可以ecba&#xff0c;ceba&#xff0c;cbea&#xff0c;cbae。 答案是4个序列。 解析&#xff1a…

CSS 复合选择器简单学习

目录 1. Emmet 语法 1.1 快速生成 HTML 结构语法 1.2 快速生成 CSS 样式 1.3 格式化工具 2. 调试 2.1 打开调试工具 2.2 使用调试工具 3. 复合选择器 3.1 后代选择器 3.2 子选择器 3.3 并集选择器 3.4 伪类选择器 3.3.1 链接伪类选择器 3.3.2 :focus 伪类选择器 …