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

ops/2024/9/20 1:17:21/ 标签: qt, 数据库, 开发语言

创建项目,添加资源文件

在这里插入图片描述
在项目文件夹中创建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.ppmy.cn/ops/112579.html

相关文章

Git常用命令(记录)

提交代码 git status 查看状态git add .或者git add xx选择提交全部或者某文件git commit -m “提交信息”git push 创建新分支提交到新的分支 git checkout -b [branch-name] 创建并切换到新分支git add [file-name] 将要上传的文件添加到暂存区git commit -m “commit mes…

JavaScript - 异步编程

1. 前言 在 JavaScript 中,异步编程是一种处理需要等待操作(如网络请求、文件读取或计时器)的编程方式。由于 JavaScript 是单线程的,意味着它一次只能执行一个任务。异步编程允许你在等待某些操作完成时,继续执行其他…

【原创】java+swing+mysql长途客车售票管理系统设计与实现

个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片,希望和大家…

C#泛型(Generic)

泛型(Generic)允许延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许编写一个可以与任何数据类型一起工作的类或方法。 可以通过数据类型的替代参数编写类或方法的规范。当编译器遇…

【JavaScript】数据结构之堆

对数据结构像树,但是,是通过数组来实现的(不是通过链表)

基于SSM的在线家用电器销售系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSSMVueMySQL的在线家…

Docker部署Joplin Server教程

Joplin Server 是 Joplin 应用的后端服务,提供笔记和待办事项的同步功能。它允许用户在不同设备之间同步笔记,同时支持多用户和协作功能。Joplin Server使用现代技术栈,数据库使用的是 PostgreSQL 。 主要功能 同步:在桌面、移动设备和网页应用之间同步笔记。多用户支持:允…

【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢?

【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢? 【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢? 文章目录 【梯度消失|梯度爆炸】Vanishing Gradi…

【限流算法】常见的限流算法有哪些,怎么做限流操作

【限流算法】常见的限流算法有哪些,怎么做限流操作 在Java应用中实现限流(Rate Limiting)通常是为了控制对资源或服务的访问速率,防止因过载而导致的服务不可用。Java中实现限流的方法有多种,以下是一些常见的方法&…

Spring Boot- 配置文件问题

Spring Boot 配置文件问题探讨 Spring Boot 是目前主流的 Java 开发框架之一,其核心特性之一便是“约定优于配置”(Convention over Configuration)。在此基础上,Spring Boot 提供了灵活而强大的配置文件机制,帮助开发…

HTML5好看的水果蔬菜在线商城网站源码系列模板2

文章目录 1.设计来源1.1 主界面1.2 商品列表界面1.3 商品详情界面1.4 其他界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/142059220 HTML5好看的水果蔬菜在线商城…

【佳学基因检测】在EXCEL中,如何获取A列的第9-29个字符,将其填入另一列中

【佳学基因检测】在EXCEL中,如何获取A列的第9-29个字符,将其填入另一列中 在 Excel 中,如果你需要从 A 列的单元格中提取第 9 到第 29 个字符,你可以使用 MID 函数来实现。这是一个非常实用的函数,用于从文本字符串中…

基于kolla-ansible在AnolisOS8.6上部署all-in-one模式OpenStack-Train

测试环境 Anolis OS8.6 Virtual Box,4 vCPU, 8G RAM, 50 vDisk。安装时删除/home,SWAP分区,全部空间给/目录。 目标是部署OpenStack All-In-One模式,控制节点计算节点存储节点在一台机器实现。 系统配置 常用工具 dnf install …

C语言--结构体(学习笔记)

内容借鉴于b站杜远超官方频道(C语言结构体详解【干货】) 首先C语言中定义变量格式为“数据类型 变量名”,如int a; float b;等等。 那么结构体则是将多个变量(数据类型 变量名)结合在一起的一种新的数据类型&…

C++掉血迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…

四川锦程消费金融有限责任公司2024年(第一批次)催收机构选型入库采购公告

四川锦程消费金融有限责任公司2024年&#xff08;第一批次&#xff09;催收机构选型入库采购公告 根据需要&#xff0c; 四川锦程消费金融有限责任公司决定对外公 开选型采购催收代理合作的催收机构&#xff0c;欢迎符合条件的催收 机构参与采购。具体公告如下&#xff1a; 一…

如何在Linux下升级R版本和RStudio

一、升级R版本 在Linux上&#xff0c;R的安装通常通过包管理器完成。不同的Linux发行版&#xff08;如Ubuntu、Debian、Fedora等&#xff09;可能略有不同。下面以Ubuntu为例&#xff0c;介绍如何升级R版本。如果你使用其他发行版&#xff0c;步骤可能类似。 二.更新步骤 2.…

UE5安卓项目打包安装

Android studio安装 参考&#xff1a;https://docs.unrealengine.com/5.2/zh-CN/how-to-set-up-android-sdk-and-ndk-for-your-unreal-engine-development-environment/ 打开android studio的官网&#xff1a;Download Android Studio & App Tools - Android Developers …

a,b,c中的最大值

题目描述 编写一个程序&#xff0c;输入a、b、c三个值&#xff0c;输出其中最大值。 输入格式 一行三个整数&#xff0c;分别为 a、b、c。 输出格式 a、b、c 中的最大值。 输入数据 1 10 20 30输出数据 1 30数据范围与提示 数字 a、b、c 都在 int 范围内。 代码 #i…

【网络安全】分享4个高危业务逻辑漏洞

未经许可,不得转载。 文章目录 正文逻辑漏洞1逻辑漏洞2逻辑漏洞3逻辑漏洞4其它正文 该目标程序是一家提供浏览器服务的公司,其核心功能是网页抓取和多账户登录操作,类似于浏览器中的隐身模式,但更加强大和高效。通过该平台,用户可以轻松管理并同时运行数百个隐身浏览器实…