【十六】【QT开发应用】Menu菜单,contextMenuEvent,setContextMenuPolicy,addAction
在 Qt 框架中,QMenu 类用于创建和管理菜单。菜单是用户界面的一部分,可以包含多个选项或动作,用户可以选择这些选项来执行特定的功能。菜单通常显示在菜单栏、上下文菜单(右键菜单)或工具栏中。
基本用法
创建菜单对象:
QMenu *menu = new QMenu(this); // 创建一个新的 QMenu 对象,父对象为当前小部件
添加动作:
使用 addAction 方法将 QAction 对象添加到菜单中。QAction 代表菜单中的一个选项或动作。
QAction *action1 = new QAction("Action 1", this);
menu->addAction(action1); // 将动作添加到菜单
显示菜单:
菜单可以在指定的位置显示,例如在鼠标光标位置。
menu->exec(QCursor::pos()); // 在当前光标位置显示菜单

widget.h
#pragma once#include <QtWidgets/QWidget>
#include "ui_widget.h"
#include <QMenu>class widget : public QWidget
{Q_OBJECTpublic:widget(QWidget *parent = nullptr);~widget();void contextMenuEvent(QContextMenuEvent* event) override;void initMenu();private:Ui::widgetClass ui;QMenu* m_pMenu = nullptr;
};
widget.cpp
#include "widget.h"
#include <QAction>
#include <QMessageBox>widget::widget(QWidget *parent): QWidget(parent)
{ui.setupUi(this);this->setContextMenuPolicy(Qt::DefaultContextMenu);initMenu();
}widget::~widget()
{}void widget::contextMenuEvent(QContextMenuEvent* event) {m_pMenu->exec(QCursor::pos());
}void widget::initMenu() {m_pMenu = new QMenu(this);QAction* pAc1 = new QAction("ac1");QAction* pAc2 = new QAction("ac2");QAction* pAc3 = new QAction("ac3");QAction* pAc4 = new QAction("ac4");QAction* pAc5 = new QAction("ac5");QAction* pAc6 = new QAction("ac6");QAction* pAc7 = new QAction("ac7");m_pMenu->addAction(pAc1);m_pMenu->addAction(pAc2);m_pMenu->addAction(pAc3);m_pMenu->addAction(pAc4);m_pMenu->addAction(pAc5);m_pMenu->addAction(pAc6);m_pMenu->addAction(pAc7);connect(pAc1, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac1");});connect(pAc2, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac2");});connect(pAc3, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac3");});connect(pAc4, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac4");});connect(pAc5, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac5");});connect(pAc6, &QAction::trigger, [=] {QMessageBox::information(this, "title", "ac6");});connect(pAc7, &QAction::trigger, [=] {QMessageBox::information(this, "title", "ac7");});
}
复盘
#include "widget.h"
#include <QAction>
#include <QMessageBox>widget::widget(QWidget *parent): QWidget(parent)
{ui.setupUi(this);// 设置上下文菜单策略为默认this->setContextMenuPolicy(Qt::DefaultContextMenu);initMenu(); // 初始化菜单
}widget::~widget()
{}void widget::contextMenuEvent(QContextMenuEvent* event) {m_pMenu->exec(QCursor::pos()); // 在光标位置执行菜单
}void widget::initMenu() {m_pMenu = new QMenu(this); // 创建新的QMenuQAction* pAc1 = new QAction("ac1"); // 创建动作ac1QAction* pAc2 = new QAction("ac2"); // 创建动作ac2QAction* pAc3 = new QAction("ac3"); // 创建动作ac3QAction* pAc4 = new QAction("ac4"); // 创建动作ac4QAction* pAc5 = new QAction("ac5"); // 创建动作ac5QAction* pAc6 = new QAction("ac6"); // 创建动作ac6QAction* pAc7 = new QAction("ac7"); // 创建动作ac7m_pMenu->addAction(pAc1); // 将动作ac1添加到菜单m_pMenu->addAction(pAc2); // 将动作ac2添加到菜单m_pMenu->addAction(pAc3); // 将动作ac3添加到菜单m_pMenu->addAction(pAc4); // 将动作ac4添加到菜单m_pMenu->addAction(pAc5); // 将动作ac5添加到菜单m_pMenu->addAction(pAc6); // 将动作ac6添加到菜单m_pMenu->addAction(pAc7); // 将动作ac7添加到菜单// 连接动作ac1的触发信号到槽函数,显示信息框connect(pAc1, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac1");});// 连接动作ac2的触发信号到槽函数,显示信息框connect(pAc2, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac2");});// 连接动作ac3的触发信号到槽函数,显示信息框connect(pAc3, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac3");});// 连接动作ac4的触发信号到槽函数,显示信息框connect(pAc4, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac4");});// 连接动作ac5的触发信号到槽函数,显示信息框connect(pAc5, &QAction::triggered, [=] {QMessageBox::information(this, "title", "ac5");});// 连接动作ac6的触发信号到槽函数,显示信息框connect(pAc6, &QAction::trigger, [=] {QMessageBox::information(this, "title", "ac6");});// 连接动作ac7的触发信号到槽函数,显示信息框connect(pAc7, &QAction::trigger, [=] {QMessageBox::information(this, "title", "ac7");});
}
setContextMenuPolicy
setContextMenuPolicy 是 Qt 中 QWidget 类的一个函数,用于设置小部件的上下文菜单策略。上下文菜单(也称为右键菜单)是用户通过右键单击触发的菜单。
Qt::ContextMenuPolicy 枚举定义了以下几种策略:
Qt::NoContextMenu: 禁用上下文菜单。
Qt::PreventContextMenu: 禁用默认上下文菜单,但仍然会触发 contextMenuEvent。
Qt::DefaultContextMenu: 使用 QWidget 的默认上下文菜单处理。
Qt::ActionsContextMenu: 显示与 QWidget 关联的动作(QAction)。
Qt::CustomContextMenu: 触发 customContextMenuRequested 信号,用户可以连接自己的槽函数来处理。
this->setContextMenuPolicy(Qt::DefaultContextMenu);
设置了默认的上下文菜单策略,即当用户右键单击小部件时,会触发 contextMenuEvent 函数。你可以在这个事件处理函数中自定义上下文菜单的行为,如下所示:
void widget::contextMenuEvent(QContextMenuEvent* event) {m_pMenu->exec(QCursor::pos()); // 在光标位置显示菜单
}
通过这个设置,你可以为小部件提供自定义的上下文菜单,而不是依赖于系统的默认菜单。
QAction 和 QMenu
QAction 和 QMenu 是 Qt 框架中用于创建和管理菜单项的类。
QAction* pAc1 = new QAction("ac1");
这行代码创建了一个新的 QAction 对象。QAction 表示一个动作,可以被用户在菜单、工具栏或快捷键中触发。构造函数接受一个字符串参数作为动作的文本标签。
QAction 构造函数: QAction(const QString &text, QObject *parent = nullptr)
text: 动作的标签文本。在这个例子中,标签是 “ac1”。
parent: 动作的父对象。这里没有指定父对象,默认值为 nullptr。
QAction* pAc1 = new QAction("ac1"); // 创建一个标签为“ac1”的新动作m_pMenu->addAction(pAc1);
这行代码将先前创建的 QAction 对象 pAc1 添加到菜单 m_pMenu 中。QMenu 是 Qt 中用于创建菜单的类,addAction 函数用于向菜单中添加一个动作。
QMenu 函数: void addAction(QAction *action)
action: 要添加到菜单中的 QAction 对象。
m_pMenu->exec(QCursor::pos());
m_pMenu->exec(QCursor::pos()); 是在 Qt 中显示上下文菜单的一种常见方式。
m_pMenu->exec(QCursor::pos());
m_pMenu:这是一个 QMenu 对象的指针,表示要显示的菜单。
exec():QMenu 类的成员函数,用于以模态方式显示菜单,并阻塞直到用户选择了菜单项或关闭了菜单。exec() 函数返回用户选择的 QAction 指针,如果用户没有选择任何项而是关闭了菜单,则返回 nullptr。
QCursor::pos():静态函数,返回当前鼠标光标的位置(以全局坐标系表示)。通过这个位置,可以在鼠标光标处显示菜单。
在上下文菜单事件中,我们通常会使用这行代码来显示上下文菜单:
void widget::contextMenuEvent(QContextMenuEvent* event) {m_pMenu->exec(QCursor::pos()); // 在光标位置显示菜单
}
显示菜单:exec() 方法会在指定位置显示菜单。在这个例子中,QCursor::pos() 返回当前光标的位置,因此菜单会在鼠标光标处弹出。
阻塞调用:exec() 是一个阻塞调用,这意味着程序执行会暂停在这一行,直到用户在菜单中选择一个动作或关闭菜单。然后,exec() 将返回选择的 QAction 或 nullptr。
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!
相关文章:
【十六】【QT开发应用】Menu菜单,contextMenuEvent,setContextMenuPolicy,addAction
在 Qt 框架中,QMenu 类用于创建和管理菜单。菜单是用户界面的一部分,可以包含多个选项或动作,用户可以选择这些选项来执行特定的功能。菜单通常显示在菜单栏、上下文菜单(右键菜单)或工具栏中。 基本用法 创建菜单对象…...
华为DCN技术:M-LAG
M-LAG(Multichassis Link Aggregation Group)即跨设备链路聚合组,是一种实现跨设备链路聚合的机制。M-LAG主要应用于普通以太网络、VXLAN和IP网络的双归接入,可以起到负载分担或备份保护的作用。相较于另一种常见的可靠性接入技术…...
k8s持久化之emptyDir使用
目录 概述实践代码 概述 理解emptyDir使用,是后续k8s持久化进阶,高阶使用的基础。 实践 代码 详细说明在代码中 # 缓存数据,可以让多个容器共享数据 # 删除 Pod 时,emptyDir 数据同步消失 # 定义 initContainer -> 下载数据…...
Java露营基地预约小程序预约下单系统源码
轻松开启户外探险之旅 🌟 露营热潮来袭,你准备好了吗? 随着人们对户外生活的热爱日益增加,露营已成为许多人周末和假期的首选活动。但你是否曾因找不到合适的露营基地而烦恼?或是因为繁琐的预约流程而错失心仪的营地…...
七天速通javaSE:第四天 java方法
文章目录 前言一、什么是方法?二、方法的定义与调用1. 方法的定义2. 方法的调用3. 练习:定义比大小方法并调用 三、方法的重载四、递归五、可变参数拓展:命令行传递参数 前言 本章将学习java方法。 一、什么是方法? java方法是用…...
jupyter notebook的markdown语法不起作用
在这个界面编辑,发现markdown你编辑的是什么就是什么,不起作用,然而点一下: 右上角“Notebook转发”,就会单独跳出一个jupyter notebook的界面,此时就会奏效:...
Redis 学习笔记(2)
目录 1 Redis的持久化1.1 RDB持久化方案1.2 AOF持久化方案 2 Redis架构2.1 主从复制架构2.2 哨兵集群设计2.3 哨兵集群设计 3 Redis事务机制4 Redis过期策略与内存淘汰机制4.1 过期策略4.2 内存淘汰机制 5 Redis高频面试题4.1 缓存穿透4.2 缓存击穿4.3 缓存雪崩 1 Redis的持久化…...
快慢指针:删除有序数组中的重复项
题目链接:. - 力扣(LeetCode) 思路好想,代码实现不好想 class Solution {public int removeDuplicates(int[] nums) {int fast 1,slow 1;while(fast < nums.length){if(nums[fast] ! nums[fast-1]){nums[slow] nums[fast]…...
用户登录错误次数太多锁定账号
当用户登录验证码错误次数太多时,需要限制用户在10分钟之内不能再次登录。 限制方案: 1.通过Redis ZSet key可以设置为用户名,value可以设置为UUID,score设置为当前时间戳 每次用户登录时,通过 rangeByScore 查询对…...
tedsign vue3 web-端框架中封装一个验证码组件 以及对应node 接口逻辑说明
一个这样的组件 我直接上代码了 <template><t-loading size"small" :loading"loading" show-overlay><div class"container" click"refresh"><div v-if"svg" class"svg" v-html"svg&…...
探索Scala并发编程之巅:高效并行处理的艺术
标题:探索Scala并发编程之巅:高效并行处理的艺术 引言 在现代软件开发中,随着多核处理器的普及,编写能够充分利用硬件能力的并发程序变得至关重要。Scala,这门结合了面向对象和函数式编程特性的语言,提供…...
AudioLM: 音频生成的革命性模型
AudioLM: 音频生成的革命性模型 AudioLM是一种革命性的音频生成模型,它结合了深度学习和自然语言处理的先进技术,能够生成高质量、逼真的音频内容。本文将探讨AudioLM的基本原理、工作机制、应用场景以及对音频生成领域的影响和未来发展方向。 一、Aud…...
C++ Vector的模拟实现
vector的介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而…...
Kubernetes之Controller详解
本文尝试从Kubernetes Controller的种类、交互逻辑、最佳实践、伪代码示例及历史演进5个方面对其进行详细阐述,希望对您有所帮助! 一、Kubernetes Controller种类 Kubernetes Controller Manager 是 Kubernetes 集群的核心组件之一,负责管理…...
openlayers性能优化——开启图层预加载、减少空白等待时间
使用切片图层时、地图拖拽会有空白图片,为了减少空白等待时间,我们可以开始图层预加载。 const map_top new Map({layers: [new TileLayer({preload:Infinity, //预加载source: new StadiaMaps({layer: "outdoors",}),}),],target: "ma…...
BlockingQueue详解(含动画演示)
目录 BlockingQueue详解0、BlockingQueue简介BlockingQueue接口中方法注释BlockingQueue的实现,总结计划 1、ArrayBlockingQueue简介2、ArrayBlockingQueue的继承体系3、ArrayBlockingQueue的构造方法①、 ArrayBlockingQueue(int capacity)②、ArrayBlockingQueue(…...
wordpress商用付费主题与免费主题的区别
WordPress免费主题与WordPress付费主题,都可以用,但存在非常大的差别。从直观的感受,简单地说就是,WordPress免费主题能用,WordPress付费主题好用。如果涉及到其它的方面,WordPress商用付费主题与免费主题之…...
【ARM Trace32(劳特巴赫) 使用介绍 2.7 -- bat 脚本传参数给 trace32 cmm 脚本】
请阅读【Trace32 ARM 专栏导读】 文章目录 bat 脚本传参数给 trace32脚本可变参数传入CMM 脚本接收参数运行BAT脚本bat 脚本传参数给 trace32脚本 在使用 Trace32 的过程中,如果每次都是通过GUI 界面来操作,是习惯使用命令行工作的人所不能忍受的!!!,那么能不同通过脚本…...
NavicatforMySQL11.0软件下载-NavicatMySQL11最新版下载附件详细安装步骤
我们必须承认Navicat for MySQL 支援 Unicode,以及本地或远程 MySQL 服务器多连线,使用者可浏览数据库、建立和删除数据库、编辑数据、建立或执行 SQL queries、管理使用者权限(安全设定)、将数据库备份/复原、汇入/汇出数据&…...
弱监督学习
弱监督学习(Weak Supervision)是一种利用不完全、不精确或噪声数据进行模型训练的方法。以下是一些常用的弱监督方法及其原理: 1. 数据增强(Data Augmentation) 原理: 数据增强是一种通过增加训练数据的多…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
