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

news2024/12/25 1:05:43

创建项目,添加资源文件

在这里插入图片描述
在项目文件夹中创建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函数会被触发,菜单会弹出。

结尾

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

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

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

相关文章

代码随想录算法训练营第五十九天 | Bellman_ford 算法精讲

目录 Bellman_ford 算法精讲 思路 什么叫做松弛 模拟过程 方法一: Bellman_ford算法 Bellman_ford 算法精讲 题目链接:卡码网:94. 城市间货物运输 I 文章讲解:代码随想录 某国为促进城市间经济交流,决定对货物运…

maya-vray渲染蒙版

要用一个叫vrayMulWrapper的材质球,把alpha Conterbution调到-1,勾选matte surface启用蒙版物体。

【C++题解】1406. 石头剪刀布?

欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1406. 石头剪刀布? 类型:二维数组 题目描述: 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出…

数据库索引底层数据结构之B+树MySQL中的页索引分类【纯理论干货,面试必备】

目录 1、索引简介 1.1 什么是索引 1.2 使用索引的原因 2、索引中数据结构的设计 —— B树 2.1 哈希 2.2 二叉搜索树 2.3 B树 2.4 最终选择之——B树 2.4.1 B树与B树的对比(面向索引)【面试题】 3、MySQL中的页 3.1 页的使用原因 3.2 页的结构 3.2.1 页文件头和页文件…

Unity实战案例全解析:PVZ 植物卡片状态分析

Siki学院2023的PVZ免费了,学一下也坏 卡片状态 卡片可以有三种状态: 1.阳光足够,(且cd好了可以种植) 2.阳光不够,(cd?好了:没好 (三目运算符)&…

Linux | 探索 Linux 信号机制:信号的产生和自定义捕捉

信号是 Linux 操作系统中非常重要的进程控制机制,用来异步通知进程发生某种事件。理解信号的产生、阻塞、递达、捕捉等概念,可以帮助开发者更好地编写健壮的应用程序,避免由于未处理的信号导致程序异常退出。本文将带你从基础概念开始&#x…

基于SpringBoot+Vue的牙科就诊管理系统(带1w+文档)

基于SpringBootVue的牙科就诊管理系统(带1w文档) 基于SpringBootVue的牙科就诊管理系统(带1w文档) 伴随着互联网发展,现今信息类型愈来愈多,信息量也非常大,那也是信息时代的缩影。近些年,电子元器件信息科学合理发展的趋势变的越…

【React】React18.2.0核心源码解读

前言 本文使用 React18.2.0 的源码,如果想回退到某一版本执行git checkout tags/v18.2.0即可。如果打开源码发现js文件报ts类型错误请看本人另一篇文章:VsCode查看React源码全是类型报错如何解决。 阅读源码的过程: 下载源码 观察 package…

C# System.BadImageFormatException问题及解决

C# System.BadImageFormatException问题 出现System.BadImageFormatException 异常有两种情况:程序目标平台不一致&引用dll文件的系统平台不一致。 异常参考 BadImageFormatException 程序目标平台不一致: 项目>属性>生成:x86 …

学LabVIEW编程,看编程书有些看不懂怎么办?

自学LabVIEW编程时,如果发现编程书籍内容难以理解,可以尝试以下几种方式来提高学习效果: 1. 从基础入手,逐步深入: LabVIEW是一种基于图形化编程的工具,不同于传统的编程语言,因此从基础概念开…

linux 操作系统下cupsenable命令介绍和使用案例

linux 操作系统下cupsenable命令介绍和使用案例 cupsenable 命令是 Linux 操作系统中用于启用 CUPS(通用打印服务)打印机的命令。它允许用户将指定的打印机重新启用,从而使其可以接受新的打印作业 cupsenable 命令概述 基本语法 bash cup…

LEAN 赋型唯一性(Unique Typing)之 n-provability 注解

《LEAN 赋型唯一性(Unique Typing)之 证明过程简介》 中,梳理了赋型唯一性(Unique Typing)牵涉的概念及相关推论与证明,此篇文章就先介绍 n-provability 的概念,记 ⊢ₙ 。其围绕的是赋型规则&a…

PHP创意无限一键生成小程序名片生成系统源码

创意无限,一键生成 —— 小程序名片生成系统,开启你的个性化商务新时代! 一、告别千篇一律,拥抱个性化名片 你还在使用那些千篇一律的传统纸质名片吗?是时候做出改变了!现在有了“创意无限一键生成小程序名…

Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED

Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED 思科 Catalyst 9000 交换产品系列 IOS XE 系统软件 请访问原文链接:https://sysin.org/blog/cisco-catalyst-9000/,查看最新版。原创作品,转载请保留出处。 作者主页&…

如何计算光伏在安装过程中的损耗程度?

光伏系统在实际安装和运营过程中,会受到多种因素的影响,导致电能损耗。这些损耗包括线缆损耗、逆变器效率、组件品质、灰尘积累、入射角损失等。 一、光伏系统损耗的分类 光伏系统的损耗大致可以分为以下几类: 1、线缆损耗:光伏…

响应式网站和自适应网站有什么区别?

响应式网站和自适应网站在技术基础、用户体验以及开发成本等方面存在显著差异。具体分析如下: 响应式网站和自适应网站有什么区别? 技术基础 响应式网站:通过CSS3的媒体查询(Media Query)来检测设备屏幕尺寸,并加载…

全网最适合入门的面向对象编程教程:49 Python函数方法与接口-函数与方法的区别和lamda匿名函数

合集 - Python面向对象编程(51) 1.可能是全网最适合入门的面向对象编程教程:Python实现-嵌入式爱好者必看!06-232.全网最适合入门的面向对象编程教程:00 面向对象设计方法导论06-243.全网最适合入门的面向对象编程教程:01 面向对…

make 程序规定的 makefile 文件的书写语法(5)

(40)接着学习自动变量,就是 make 程序执行时,自动定义和产生的变量,来描述 makefile 文件,可以直接拿来用: 补充 D 与 F 的使用,前者只获得目录,后者只获得文件名&#x…

【C++算法】滑动窗口

长度最小的子数组 题目链接: 209. 长度最小的子数组 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-size-subarray-sum/description/ 算法原理 代码步骤: 设置left0,right0设置sum0,len0遍历l…

深度学习-13-小语言模型之SmolLM的使用

文章附录 1 SmolLM概述1.1 SmolLM简介1.2 下载模型2 运行2.1 在CPU/GPU/多 GPU上运行模型2.2 使用torch.bfloat162.3 通过位和字节的量化版本3 应用示例4 问题及解决4.1 attention_mask和pad_token_id报错4.2 max_new_tokens=205 参考附录1 SmolLM概述 1.1 SmolLM简介 SmolLM…