【十六】【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。

结尾

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

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

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

相关文章

深入解读一下 `com.google.android.material.appbar.CollapsingToolbarLayout`

简介 在现代 Android 应用中&#xff0c;提供流畅且美观的用户体验是非常重要的。CollapsingToolbarLayout 是 AndroidX库中 Material Components 的一部分&#xff0c;它提供了一种易于实现的可折叠工具栏效果&#xff0c;常用于提供视觉吸引力的标题栏和动画效果。 本文将详…

已解决Writing ‘modem_a‘FAILED (remote: ‘Operation not permitted‘

今天用可视化工具FastbootEnhance线刷&#xff0c;没有注意到日志报错&#xff0c;开机后黑屏&#xff0c;电脑能检测到是开机状态&#xff0c;电源键按下有声音。 排除线刷包问题&#xff0c;翻看FastbootEnhance的日志&#xff0c;它的日志放到记事本全屏方便观看&#xff0…

项目1111

中文显示姓名列和手机号 SELECT contact_name AS 姓名, contact_phone AS 手机号 FROM 2_公司id; 使用explain测试给出的查询语句&#xff0c;显示走了索引查询 EXPLAIN SELECT * FROM 7_订单数量 WHERE countid LIKE e%; 统计用户订单信息&#xff0c;查询所有用户的下单数量…

Prometheus中添加基本身份验证功能

在Prometheus中添加基本身份验证功能&#xff0c;可以按照以下步骤进行&#xff1a; 一、生成哈希密码 首先&#xff0c;需要安装bcrypt工具&#xff0c;用于生成哈希密码。这可以通过Python的bcrypt库来完成。如果未安装&#xff0c;可以使用pip进行安装。 创建一个Python脚…

Android性能优化——卡顿优化

文章目录 一、从XML到屏幕上的展示造成跳帧的因素有那些发现问题定位问题定位代码 一、从XML到屏幕上的展示 数据加载阶段 数据控制阶段 数据展示阶段 xml —> view onCreat —> 解析layout.xml resume —> view —> wms ViewRootImpl UI 绘制流程 &#xff1a;测…

计算机网络之数据通信原理

1.通信系统的基本组成 信源&#xff1a;信息的发出者&#xff1b; 信宿&#xff1a;信息的接收者&#xff1b; 载体&#xff1a;信息的传送通道&#xff1b; 变换器&#xff1a;将信息变换成载体上可传输的信号&#xff1b; 反变换器&#xff1a;将载体上传输的信号变换成信…

Java中网络安全的基础知识

Java中网络安全的基础知识 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代互联网应用中&#xff0c;网络安全是一个至关重要的话题。随着网络攻击和数据…

Java零基础-集合:TreeSet

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

SQL基础:掌握数据查询与操作的核心技能(四)

引言&#xff1a;数据操作的语言艺术 在前一章节《数据库与表的基本操作》中&#xff0c;我们深入了解了如何创建、管理数据库和表&#xff0c;构建了数据存储的基础框架。本章节&#xff0c;我们将深入探索SQL语言&#xff0c;它是数据库管理系统的通用语言&#xff0c;用于数…

SpringBoot集成Druid数据库连接池并配置可视化界面和监控慢SQL

pom.xml <!-- Druid 数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.23</version></dependency>application.yml spring:jackson:date-…

明星周边物品交易购物系统

摘 要 随着明星文化的兴起和粉丝经济的蓬勃发展&#xff0c;明星周边产品的市场需求日益增长。明星周边物品包括各种与明星相关的商品&#xff0c;如T恤、海报、手办、签名照等&#xff0c;它们成为粉丝们表达对明星喜爱和支持的方式之一。通过“星光璀璨”来形象化地表达明星…

Flask的 preprocess_request

理解 Flask 类似框架中的 preprocess_request 方法 在 Flask 类似的 web 框架中&#xff0c;preprocess_request 方法是一个关键组件。它在请求被分派之前调用&#xff0c;用于执行一些预处理操作。让我们一步一步来理解这个方法的工作原理。 1. 方法概述 首先&#xff0c;我…

【Android面试八股文】说一说Handler的sendMessage和postDelay的区别?

文章目录 一、`sendMessage` 方法1.1 主要用法1.2 适用场景二、`postDelayed` 方法2.1 主要用法2.2 适用场景三、 区别总结3.1 区别3.2 本质上有差别吗?四、实例对比4.1 使用`sendMessage`4.2 使用`postDelayed`五、结论Handler类在Android中用于消息传递和任务调度。 sendMe…

基于Java技术的在线学习平台系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;基于SpringBoot框架 工具&#xff1a;Eclipse、Navicat、M…

n次方差公式推导

1. 推导 数列求和 S a 1 a 2 ⋯ a n , 公比为 q q S a 2 a 3 ⋯ a n 1 ( 1 − q ) S a 1 − a n 1 a 1 : 1 化简 ( 1 ) ( 3 ) S 1 q ⋯ q n − 1 ( 1 − q ) S 1 − q n ( 4 ) 代入 ( 5 ) ( 1 − q ) ( 1 q ⋯ q n − 1 ) 1 − q n q : b a 代入 ( 6 )…

Qt 学习(一) addressbook

Qt Demo: addressbook (1)创建项目&#xff1a;选择不创建界面&#xff0c;即UI&#xff0c;此时会自动生成的文件如图所示&#xff1a; QApplication&#xff1a; MainWindow 继承自 QMainWindow&#xff0c;根据需要设计的界面样式。 (2)确定MainWindow 的成员变量 首先&…

Jetpack架构组件_Navigaiton组件_1.Navigaiton切换Fragment

1.Navigation主要作用 方便管理Fragment &#xff08;1&#xff09;方便我们管理Fragment页面的切换 &#xff08;2&#xff09;可视化的页面导航图&#xff0c;便于理清页面间的关系。 &#xff08;3&#xff09;通过destination和action完成页面间的导航 &#xff08;4&a…

算尽天下财,铸就大明梦 —— 大明钱算子夏元吉的传奇一生

仕途生涯开始&#xff1a;洪武二十三年&#xff08;1390年&#xff09;&#xff0c;夏元吉因精通《诗经》&#xff0c;由湖广乡荐参加礼部组织的会试&#xff0c;虽未中举&#xff0c;但他并未气馁&#xff0c;反而更加努力地学习。洪武二十四年&#xff08;1391年&#xff09;…

通讯:单片机串口和电脑通讯

目录 1.串口输出数据到电脑 硬件部分 串口输出数据到电脑的软件软件部分&#xff1a; 相关问题&#xff1a; 2.单片机串口--485--485转USB--电脑 串口&#xff0c;芯片&#xff0c;转换器&#xff0c;设备之间的通讯的接线&#xff0c;都是要TX--RX, RX--TX 交叉连接。 单…

充电桩现场安装施工流程

摘要&#xff1a;在化石能源日益紧缩的今天&#xff0c;新能源车辆逐渐走进了千家万户&#xff0c;与传统化石能源车辆相比&#xff0c;以电驱动的新能源车辆能源利用率高&#xff0c;缩短了能源传递过程&#xff0c;实现了能源有效利用。根据能量守恒定律可知&#xff0c;任何…