Qt应用开发(基础篇)——菜单 QMenu
一、前言
QMenu类继承于QWidget,它提供了一个菜单样式的小部件,用于菜单栏、上下文菜单和一些弹出式菜单。

QMenu菜单的选项是可选的,它可以是一个下拉的菜单,也可以是独立的上下文菜单。下拉菜单通常作用于当用户单击相应的项目或按下指定的快捷键时,使用QMenuBar::addMenu()将菜单插入到菜单栏中,菜单栏将显示下拉菜单。上下文菜单通常通过一些特殊的键盘键或右键来调用。它们可以用popup()异步执行,也可以用exec()同步执行。当然菜单也可以在一些触发事件中调用,比如按下按钮时。
QMenu菜单由一系列操作项QAcion组成,QAcion在QMenu调用addAction()、addActions()、insertAction()的时候添加,动作垂直表示,样式由QStyle呈现。此外,操作可以有一个文本标签,在最左边绘制一个可选的图标,以及快捷键序列。
void MainWindow::on_pushButton_clicked()
{QMenu *menu = new QMenu(); menu->addAction(QIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon)),"copy");menu->addAction("cut");menu->addAction("paste");menu->popup(QPoint(this->pos().x()+100,this->pos().y()+100));
}

QMenu菜单有四种类型的操作项:分隔符、子菜单、小部件和执行操作。使用addSeparator()插入分隔符,使用addMenu()插入子菜单。当插入动作项时,通常指定一个接收器和插槽,此外,QMenu提供了两个信号,triggered()和hover(),它们向从菜单触发的QAction发出信号,我们也可以从这里知道哪个QAction被触发。
在下面的示例中,我们指定copy动作的同时定义信号槽,并且绑定menu的triggered信号,点击copy就会打印“copy Triggered”两次。
警告:要使QMenu在软件上可见,应该使用exec()或popup()而不是show()。如果使用show(),没有指定坐标的情况下,菜单会直接显示屏幕的左上角。
void MainWindow::on_pushButton_clicked()
{
QMenu *menu = new QMenu();
QAction *copyAcy = menu->addAction(QIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon)),"copy",this,SLOT(onCopyTriggered()),QKeySequence(Qt::CTRL + Qt::Key_C));
menu->addAction("cut");
menu->addSeparator();
QMenu *sub_menu = new QMenu("help");
menu->addMenu(sub_menu);
menu->addMenu(sub_menu);
sub_menu->addAction("about");
menu->popup(QPoint(this->pos().x()+100,this->pos().y()+100));connect(menu,&QMenu::triggered,[=](QAction *action *action){if(action == copyAcy){qDebug()<<"copy Triggered";}});
}void MainWindow::onCopyTriggered()
{qDebug()<<"copy Triggered";
}

二、QMenu类
1、icon
该属性表示菜单的选项图标,默认是一个空的图标。
bool autoRepeat() const
void setAutoRepeat(bool)
在上面的实例我们添加一句:
sub_menu->setIcon(QIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon)));

2、separatorsCollapsible
该属性表示是否连续分隔符是否应在视觉上折叠为单个分隔符,菜单开头或结尾的分隔符也被隐藏,该属性默认为true。
3、tearOffEnabled
该属性表示菜单是否可以被撕下,当为true时,菜单包含一个特殊的可撕毁项(通常显示为菜单顶部的虚线)。用户可以“撕掉”经常使用的菜单,该项在触发时创建菜单的副本。这个“撕下来的”副本位于屏幕上一个单独的窗口中。这个概念通常不会在微软Windows上使用,所以我们一般也不回使用,当做了解就行了。此属性默认为false。
bool isTearOffEnabled() const
void setTearOffEnabled(bool)
4、title
该属性表示菜单的标题,默认情况下是一个空的字符串,所以不显示。
QString title() const
void setTitle(const QString &title)
5、toolTipsVisible
该属性表示是否要显示工具提示,默认为false。
bool toolTipsVisible() const
void setToolTipsVisible(bool visible)
QAction *copyAcy = menu->addAction(QIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIIcon)),"copy",this,SLOT(onCopyTriggered()),QKeySequence(Qt::CTRL + Qt::Key_C));
copyAcy->setToolTip("this is copy");

6、公共函数
1)addAction
添加动作QAction,返回QAction指针,可以传入文本,图标,触发响应的槽函数和按键快捷方式。
QAction *addAction(const QString &text)
QAction *addAction(const QIcon &icon, const QString &text)
QAction *addAction(const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)
QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)
QAction *addAction(const QString &text, Functor functor, const QKeySequence &shortcut = 0)
QAction *addAction(const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)
QAction *addAction(const QIcon &icon, const QString &text, Functor functor, const QKeySequence &shortcut = 0)
QAction *addAction(const QIcon &icon, const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)
2)actionAt
返回指定坐标pos下的QAction指针,如果不存在则返回空指针。
QAction *actionAt(const QPoint &pt) const
3)actionGeometry
返回指定坐标pos下的QAction指针,如果不存在则返回空指针。
QRect actionGeometry(QAction *act) const
4)activeAction
返回当前高亮显示的QAction指针,如果当前没有高亮显示的操作,则返回空指针。
QAction *activeAction() const
5)setActiveAction
设置指定的QAction为高亮。
void setActiveAction(QAction *act)

6)defaultAction
返回当前默认的QAction指针。
QAction *defaultAction() const
7)setDefaultAction
返回某QAction为默认操作,默认操作会有一个视觉提示,通常表示在发生删除时默认会发生什么。
QAction *defaultAction() const

8)addMenu
添加子菜单,参考上文示例。
QAction *addMenu(QMenu *menu)
QMenu *addMenu(const QString &title)
QMenu *addMenu(const QIcon &icon, const QString &title)
9)insertMenu
在before之前插入菜单。
QAction *insertMenu(QAction *before, QMenu *menu)
10)addSection
添加section动作,样式是一个分隔符带文本和图标,返回QAction指针。就好像一个QAction::setSeparator(true)但是又有文本和图标提示的动作。样式取决与系统的GUI样式。
QAction *addSection(const QString &text)
QAction *addSection(const QIcon &icon, const QString &text)
QMenu *menu = new QMenu();
menu->addAction(QIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon)),"copy");
menu->addSection("handle");
menu->addAction("cut");
menu->addAction("paste");

11)insertSection
在before之前插入seciton动作。
QAction *insertSection(QAction *before, const QString &text)
QAction *insertSection(QAction *before, const QIcon &icon, const QString &text)
12)addSeparator
添加分隔符。
QAction *addSeparator()
13)addSeparator
在before之前插入分隔符。
QAction *insertSeparator(QAction *before)
14)exec
同步执行此菜单,相当于exec(pos())。返回在弹出菜单或其子菜单中触发的QAction,如果没有触发项(通常是因为用户按了Esc),则返回空指针。
QAction *exec()
QAction *exec(const QPoint &p, QAction *action = nullptr)
//静态函数
QAction *exec(QList<QAction *> actions, const QPoint &pos, QAction *at = nullptr, QWidget *parent = nullptr)
在大多数情况下,需要自己指定位置,比如:
exec(QCursor::pos());
exec(somewidget.mapToGlobal(QPoint(0,0)));
exec(e->globalPos());
15)popup
显示菜单,使动作atAction位于指定的全局位置p。
void popup(const QPoint &p, QAction *atAction = nullptr)
16)clear
删除所有菜单的操作。
void clear()
17)isEmpty
返回菜单操作项数量是否为空。
bool isEmpty() const
18)setAsDockMenu
通过选项单击应用程序dock图标,将此菜单设置为可用的dock菜单。仅在macOS上可用。
void setAsDockMenu()
19)menuAction
返回与此菜单关联的QAction指针
QAction *menuAction() const
7、信号
1)hovered
该信号在菜单操作被高亮显示时触发,action是触发信号的动作,通常用于更新状态信息。
void hovered(QAction *action)
2)triggered
该信号在触发此菜单中的操作时触发,action是触发信号的动作,通常将每个菜单动作的触发器()信号连接到它自己的自定义槽,但有时你会想要将几个动作连接到一个槽,例如,当你有一组密切相关的动作,如“左对齐”,“居中”,“右对齐”。
void triggered(QAction *action)
3)aboutToShow
该信号在菜单显示的时候触发。
void aboutToShow()
4)aboutToHide
该信号在菜单隐藏的时候触发。
void aboutToHide()相关文章:
Qt应用开发(基础篇)——菜单 QMenu
一、前言 QMenu类继承于QWidget,它提供了一个菜单样式的小部件,用于菜单栏、上下文菜单和一些弹出式菜单。 QMenu菜单的选项是可选的,它可以是一个下拉的菜单,也可以是独立的上下文菜单。下拉菜单通常作用于当用户单击相应的项目或…...
MySQL-DDL语句
MySQL-DDL语句 数据库操作语句增删数据库查看数据库列表创建数据库进入(使用)数据库/查看当前所在的数据库查看数据库的建库语句查看数据库的编码集和校验集删除数据库修改数据库的编码集查看数据库支持的编码集和校验集 数据库备份备份单个数据库恢复数…...
总结987
考研倒计时102天 时间记录: 6:20起床 7:00~7:40早读,13年tex2 7:50~8:20实验室 8:30~8:34列日计划 8:40~11:18进步本回顾,记录 11:20~12:20计算机网络网课 2:10~3:05计网20道选择题 3:07~4:42政治1000题25道选择题纠错 …...
【服务器 | 测试】如何在centos 7上面安装jmeter
安装之前需要几个环境,以下是列出的几个环境 CentOS 7.7 64位JDK 1.8JMeter 5.2 1. 下载jmeter安装包 JMeter是开源的工具,安装 JMeter 要先安装好 JDK 的环境,安装JDK在前面的文章已经讲到 JMeter最新版下载地址:Apache JMeter…...
20.04部署cartographer
部署cartographer sudo apt-get update sudo apt-get install -y python3-wstool python3-rosdep ninja-build stow下载cartographer新建了一个ws mkdir carto_ws cd carto_ws wstool init src wstool merge -t src https://raw.githubusercontent.com/cartographer-project/…...
djangoMTV初探
1.restful请求方式 一个视图对应多个操作(增删改查) 老的方式 views.py from django.shortcuts import render from django.http import HttpResponse,request,QueryDict, JsonResponse from myapp.models import User from django.views.generi…...
Minecraft--基于云服务器搭建自己的服务器--简易搭建
阿丹: 上一个项目结束了。但是看着自己的服务器想着能不能做点啥子吧。想到了之前和兄弟们玩的麦块。好久没和兄弟们一起玩耍了。怀念之前一起连一个wifi玩我的世界的时候是真快乐。于是尝试自己动手搭建一个我的世界服务器,邀请兄弟们重温一下快乐。 提…...
【数据结构与算法】十大经典排序算法
文章目录 前言一、常见十大排序算法总结1、名词解释2、时间复杂度 二、排序算法与C语言实现1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序9、桶排序10、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…...
Android 12.0 SystemUI下拉状态栏定制化之隐藏下拉通知栏布局功能实现(一)
1.前言 在12.0的系统定制化开发中,由于从12.0开始SystemUI下拉状态栏和11.0的变化比较大,所以可以说需要从新分析相关的SystemUI的 布局,然后做分析来实现不同的功能,今天就开始实现关于隐藏SystemUI下拉状态栏中的通知栏布局系列一 如图: 2.SystemUI下拉状态栏定制化之…...
665. 非递减数列-先改后验法
665. 非递减数列 给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 < i < n-2),总满足 nums[i] < …...
调教 文心一言 生成 AI绘画 提示词(Midjourney)
文章目录 第一步第二步第三步第四步第五步第六步第七步第八步 文心一言支持连续对话 我瞎玩的非专业哈哈 第一步 你好,今天我们要用扩散模型创建图像。我会给你提供一些信息。行吗? 第二步 这是Midjourney的工作原理:Midjourney是另一个基于ai的工具,能…...
半导体制造工艺(一)光刻
在这里开个新专题,主要详细描述半导体制造整个流程中所用到的设备工艺步骤。 在集成电路制造工艺中,光刻是决定集成器件集成度的核心工序,该工序的作用是将图形信息从掩模版(也称掩膜版)上保真传输、转印到半导体材料衬…...
【海思SS626 | 开发环境】VMware17安装Ubuntu 18.04.6
目录 一、下载 Ubuntu 18.04.6 LTS二、VMware17创建虚拟机三、安装Ubuntu18.04LTS四、安装其他软件五、总结 一、下载 Ubuntu 18.04.6 LTS 问题:为什么要下载 Ubuntu18.04.6 LTS 而不是使用最新的,或者其他Linux发行版? 答:在ss6…...
Vue知识系列(3)每天10个小知识点
目录 系列文章目录Vue知识系列(1)每天10个小知识点Vue知识系列(2)每天10个小知识点 知识点**21. Vue不同生命周期**的概念、作用、原理、特性、优点、缺点、区别、使用场景**22. Vue 子组件和父组件执行顺序****23. created 和 mo…...
Java基础入门·多线程·线程池ThreadPool篇
前言 特点分析 线程池ThreadPool 销毁线程池 Executor类 Callable接口 线程池使用 …...
Trinitycore学习之在vscode查看远端服务器上源码配置
1:安装vscode,去官网下载,这里下载windows版本安装包 .zip https://code.visualstudio.com/Download 2:安装后,安装扩展chinese,使用中文设置,需要重启vscode。 3:安装ssh相关插件…...
583. 两个字符串的删除操作 -- 动规
583. 两个字符串的删除操作 class MinDistance:"""583. 两个字符串的删除操作https://leetcode.cn/problems/delete-operation-for-two-strings/description/"""def solution(self, text1: str, text2: str) -> int:"""这道题…...
SOME/IP
介绍 SOME/IP是一种汽车中间件解决方案,可用于控制消息。它从一开始就被设计为完美地适应不同尺寸和不同操作系统的设备。这包括小型设备,如相机、AUTOSAR 设备,以及头戴设备或远程通信设备。它还确保SOME/IP支持信息娱乐域以及车辆中其他域…...
[2023.09.12]: Yew应用开发的第一个hook--use_state
Yew的SSR模式推荐使用function_component组件,并且在function_component中使用hooks。其中,我使用到的第一个hook是use_state。use_state的设计意图与React中的useState非常相似,都是为了保存并修改当前的状态。然而,由于Yew是用R…...
使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人
使用LangchainGPT向量数据库chromadb 来创建文档对话机器人 一.效果图如下: 二.安装包 pip install langchainpip install chromadbpip install unstructuredpip install jieba三.代码如下 #!/usr/bin/python # -*- coding: UTF-8 -*-import os # 导入os模块&…...
BabelDOC终极指南:如何完美保留PDF格式的专业文档翻译工具
BabelDOC终极指南:如何完美保留PDF格式的专业文档翻译工具 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 你是否曾为翻译PDF文档而烦恼?格式错乱、公式变形、排版混乱—…...
机器学习能否学到真实概率?从校准、博弈到直接可观测性的理论边界与实践启示
1. 项目概述在构建一个声称能够预测未来或评估风险的AI系统时,我们常常会听到这样的承诺:“我们的模型能够学习到事件的真实概率。” 无论是预测明日的降雨、评估贷款的违约风险,还是诊断疾病的概率,这个承诺都极具吸引力。它暗示…...
【Claude文档分析高阶战法】:3个被90%用户忽略的PDF/OCR/多语言混合解析技巧
更多请点击: https://intelliparadigm.com 第一章:Claude文档分析高阶战法总览 Claude在处理长文本、结构化文档与跨段落语义推理方面展现出独特优势,但要释放其全部潜力,需超越基础提问,构建系统化的分析范式。本章聚…...
机器学习预测因果边界:从数据稀缺子群体到精准决策
1. 项目概述与核心挑战在医疗、经济、政策评估等关键决策领域,我们常常需要回答一个核心问题:“如果我采取了某项干预措施,结果会有什么不同?”这本质上是一个因果推断问题,它超越了简单的相关性分析,旨在揭…...
信用评分中的算法公平性:从理论到实践的全面解析
1. 项目概述:当信用评分遇上算法公平性在金融科技领域,信用评分模型早已不是新鲜事物。从传统的逻辑回归到如今复杂的梯度提升树和神经网络,机器学习模型凭借其强大的预测能力,已经成为银行和金融机构进行信贷决策、管理风险的核心…...
量子机器学习核心算法解析:从量子比特到PCA与K-means实践
1. 量子信息基础:从比特到算法的跃迁在经典计算的世界里,信息的基本单位是比特,它非0即1,清晰明了。但当我们踏入量子计算的领域,一切规则都变得不同。量子信息的基本单元是量子比特,它不再局限于单一的0或…...
C#中协变逆变的实现
1. 协变与逆变的概念协变(Covariance)允许将子类(派生类)类型作为父类(基类)类型使用。例如:IEnumerable<string> 可以被视为 IEnumerable<object>,因为 string 是 obje…...
在CentOS 7.9上保姆级安装Keysight ADS 2024,并解决Virtuoso集成报错(附完整环境变量配置)
在CentOS 7.9上实现Keysight ADS 2024与Cadence Virtuoso无缝集成的全流程指南对于射频集成电路(RFIC)设计工程师而言,Keysight ADS(Advanced Design System)与Cadence Virtuoso的协同工作能力是提升设计效率的关键。本…...
Linux内核启动时,你的isolcpus参数到底经历了什么?从GRUB到CPU掩码的完整旅程
Linux内核启动时,isolcpus参数的奇幻漂流:从GRUB配置到CPU隔离的完整解密当你在GRUB配置文件中写下isolcpus2-3这行看似简单的指令时,可能不会想到这个字符串将经历一场跨越多个软件层的奇妙旅程。本文将带你以侦探视角,追踪这个参…...
Vision Mamba边缘部署:从算法瓶颈到专用硬件加速器设计
1. 项目概述:为什么我们需要为Vision Mamba定制硬件?在边缘设备上部署视觉大模型,听起来就像让一台家用轿车去跑F1赛道——动力、空间、散热,处处都是瓶颈。传统的Transformer架构,比如ViT,虽然性能强悍&am…...
