【二十】【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类来向一个列表控件中添加带图标和文字的项目。具体解释如下:
- QListWidgetItem: 每一个
QListWidgetItem对象代表一个列表项,可以包含图标和文本。 - QIcon:
QIcon类用来加载和表示图标,图标的路径是从资源文件中加载的(":/demo12_listwidget/resources/..."是指向Qt资源系统中的路径)。 - 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添加到一个名为listWidget的QListWidget控件中。这个控件在用户界面中用来显示这些带图标和文本的列表项。
初始化函数
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函数用于连接信号与槽。当pAc1的triggered信号被触发(即当用户点击“动作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函数将listWidget的customContextMenuRequested信号与demo12_listwidget::on_PopupRightMenu槽函数连接起来。customContextMenuRequested信号:这是当用户右键单击时,QListWidget发出的信号,传递右键单击的相对位置QPoint。- 槽函数
on_PopupRightMenu:这是一个自定义的函数,用于在指定位置弹出右键菜单(该函数在之前的代码中已定义)。 - 这样,当用户在
listWidget中右键点击时,on_PopupRightMenu函数会被触发,菜单会弹出。
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!
相关文章:
【二十】【QT开发应用】listwidget右键菜单和删除item
创建项目,添加资源文件 在项目文件夹中创建resources资源文件夹。 在vs中打开qrc文件,选择添加资源文件。 选择我们resources资源文件中的所有文件作为资源文件。 最后不要忘记点击保存。 向ListWidget控件添加item 右键菜单 在.h文件中添加QMenu头…...
LabVIEW机动车动态制动性能校准系统
机动车动态制动性能测试系统通过高精度的硬件设备与LabVIEW软件的紧密配合,实现了对机动车制动性能的精确校准与评估。系统不仅提高了测试的精确性和效率,而且具备良好的用户交互界面,使得操作更加简便、直观。 项目背景 随着机动车辆数量的…...
Linux(CentOS8)服务器安装RabbitMQ
我安装了很久都没有成功, 各种问题, 每次的异常都不一样, 现将成功安装过程做个总结 安装前工作 确保已经安装了一些基础工具和组件库 下载安装包 https://www.erlang.org/patches/otp-24.3.4.5 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.15/ra…...
R语言进行无序多分类Logistic回归
在临床研究中,接触最多的是二分类数据,如淋巴癌是否转移,是否死亡,这些因变量最后都可以转换成二分类0与1的问题。然后建立二元logistic回归方程,可以得到影响因素的OR值。但有时我们也会接触到多分类结局数据…...
Maven从入门到精通(三)
一、Settings 配置 settings.xml 用来配置 maven 项目中的各种参数文件,包括本地仓库、远程仓库、私服、认证等信息。 全局 settings、用户 setting、pom 的区别: 全局 settings.xml 是 maven 的全局配置文件,一般位于 ${maven.home}/conf…...
Red Hat 和 Debian Linux 对比
原图的作者(https://bbs.deepin.org/post/209759) Red Hat Enterprise Linux https://www.redhat.com/ CentOS Linux https://www.centos.org/ Fedora Linux https://fedoraproject.org/ Debian https://www.debian.org/ Ubuntu https://cn.ubuntu.com/ https://ubuntu.c…...
Axure设计之全屏与退出全屏交互实现
在Axure RP中,设计全屏与退出全屏的交互功能可以极大地提升用户体验,尤其是在展示产品原型或进行演示时。本文将详细介绍如何在Axure RP中通过结合JavaScript代码实现全屏与退出全屏的交互效果。 Axure原型设计web端交互元件库:https://…...
如何测试出自己电脑的网络速度(网速)?
首先电脑上要下载一个这样的一个电脑软件:360安全卫士 1、打开软件之后,选择【网络安全】 2、选择【宽带测速器】 3、点击之后,即可开始检测当前网络速度,等待大概十几秒后会出现结果,如下: 位置①:显示…...
如何利用AI进行有效的科技产品发布
如果你们公司即将推出一款具有颠覆性的软件,你大概已经了解了科技在现代市场中的价值。 但像AI这样的技术不仅仅是有效的产品组成部分,它们还可以帮助将这些产品推向客户(或安装到他们的电脑上)。 Kuno Creative明白AI在科技营销…...
二层、三层网络基本原理
文章目录 二层网络整体拓扑相关配置配置namespace创建switch创建veth设备配置veth的IP启动veth 测试 三层网络配置vm1配置vm2配置 测试 二层网络 我们用Linux bridge模拟现实中的switch,用namespace模拟连接在交换机上的pc 整体拓扑 ------------------ ----…...
全面掌握 Jest:从零开始的测试指南(上篇)
随着JavaScript在前后端开发中的广泛应用,测试已成为保证代码质量的关键环节。 为什么需要单元测试 在我们的开发过程中,经常需要定义一些算法函数,例如将接口返回的数据转换成UI组件所需的格式。为了校验这些算法函数的健壮性,部…...
Go 交叉编译
Mac 下编译 Linux 和 Windows 64位可执行程序 Linux: CGO_ENABLED0 GOOSlinux GOARCHamd64 go build main.go Windows: CGO_ENABLED0 GOOSwindows GOARCHamd64 go build main.go Linux 下编译 Mac 和 Windows 64位可执行程序 Mac: CGO_ENABLED0 G…...
goctl安装失败
今天遇到一个很奇怪的问题 在阿里云的ubuntu服务器上远程安装goctl:go install github.com/zeromicro/go-zero/tools/goctllatest,后面会断开ssh连接,就再也连不上了,connecting with ssh timed out。在阿里云的workbench上连接显…...
DebateGPT:通过多智能体辩论监督微调大模型
人工智能咨询培训老师叶梓 转载标明出处 这些模型的训练通常依赖于资源密集型的人工反馈,这不仅成本高昂,而且耗时。为了解决这一问题,一篇名为《FINE-TUNING LARGE LANGUAGE MODELS WITH MULTI-AGENT DEBATE SUPERVISION》的论文提出了一种…...
【最新综述】基于深度学习的超声自动无损检测(下)
4.Levels of automation 5.Basic axioms for DL-based ultrasonic NDE 在回顾了最新技术和每个自动化级别的贡献之后,我们不难发现,目前的数字语言方法论在不同论文之间存在着很大的差异。例如,有些作者提出了同时处理不同步骤的模型[121]&…...
kali——tshark的使用
目录 前言 使用方法 tshark提取流量为文档 前言 tshark 是一个命令行的网络分析工具,它用于捕获和分析网络流量。它支持多种网络协议,包括 TCP、UDP、ICMP 等。Tshark 可以用于调试网络问题、进行安全审计、分析应用程序性能等。 在 Kali Linux 中&…...
TortoiseSVN图标不显示的解决
解决办法一:修改svn软件的图标设置 1、选中一个文件夹或在桌面空白处,右击进入svn的setting 2、进入setting->Icon Overlays,Status cache选择Default或shell,然后点击应用 3、查看文件,图标可以正常显示 解决办法二:修改注册表的文件夹顺序 问题现象: 1、svn一直…...
Oracle 11gR2打PSU补丁详细教程
1 说明 Oracle的PSU(Patch Set Update)补丁是Oracle公司为了其数据库产品定期发布的更新包,通常每季度发布一次。PSU包含了该季度内收集的一系列安全更新(CPU:Critical Patch Update)以及一些重要的错误修…...
2.4 卷积1
2.4 卷积1 2.4 卷积 在了解了系统及其脉冲响应之后,人们可能会想知道是否有一种方法可以通过任何给定的输入信号(不仅仅是单位脉冲)确定系统的输出信号。卷积就是这个问题的答案,前提是系统是线性且时不变的(LTI&…...
OA项目值用户登入首页展示
1.什么是OA 办公自动化(Office Automation,简称OA)是将现代化办公和计算机技术结合起来的一种新型的办公方式。办公自动化没有统一的定义,凡是在传统的办公室中采用各种新技术、新机器、新设备从事办公业务,都属于办公自动化的领域。通过实现办公自动化,或者说实现数字化…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
