qt-C++笔记之addAction和addMenu的区别以及QAction的使用场景
qt-C++笔记之addAction和addMenu的区别以及QAction的使用场景
code review!
文章目录
- qt-C++笔记之addAction和addMenu的区别以及QAction的使用场景
- 1.QMenu和QMenuBar的关系与区别
- 2.addMenu和addAction的使用场景区别
- 3.将QAction的信号连接到槽函数
- 4.QAction的使用场景
- 5.将例1修改为不使用QMainWindow,使用QWidget
- 6.QMenuBar *menuBar = new QMenuBar(&window); 详解
1.QMenu和QMenuBar的关系与区别
QMenu和QMenuBar是Qt中用于创建菜单的两个类,它们之间存在关系和区别。
-
关系:
QMenuBar是顶层窗口的菜单栏,通常位于窗口的顶部,负责承载和管理菜单。QMenu是菜单栏中的一个菜单项,可以包含子菜单、动作等。
通常情况下,你会创建一个
QMenuBar对象作为主窗口的菜单栏,然后使用addMenu方法添加多个QMenu对象作为菜单栏的菜单项。 -
区别:
QMenuBar是一个顶级窗口部件,用于承载和管理菜单。它通常只有一个,并且位于主窗口的顶部。QMenu是一个弹出菜单或子菜单,它可以包含多个菜单项(QAction),以及子菜单(另一个QMenu)。
总的来说,
QMenuBar是用于创建和管理菜单栏的部件,而QMenu是用于创建和管理菜单的部件。QMenuBar通常只有一个,用于承载多个QMenu对象,而每个QMenu对象可以包含多个菜单项和子菜单。
以下是一个简单的示例代码,演示了如何创建QMenuBar和QMenu:
例1

代码
#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QMenu>
#include <QAction>int main(int argc, char *argv[]) {QApplication app(argc, argv);QMainWindow mainWindow;QMenuBar *menuBar = mainWindow.menuBar();QMenu *fileMenu = menuBar->addMenu("File");QAction *newAction = fileMenu->addAction("New");QAction *openAction = fileMenu->addAction("Open");QMenu *editMenu = menuBar->addMenu("Edit");QAction *cutAction = editMenu->addAction("Cut");QAction *copyAction = editMenu->addAction("Copy");mainWindow.show();return app.exec();
}
上述示例中,首先创建了一个QMenuBar对象,然后使用addMenu方法在菜单栏中添加了两个QMenu对象:File和Edit。每个QMenu对象又通过addAction方法添加了相应的动作(菜单项)。
总结:QMenuBar是用于创建和管理菜单栏的顶级窗口部件,而QMenu是用于创建和管理菜单的部件。QMenuBar可以包含多个QMenu对象作为菜单项,而每个QMenu对象可以包含多个菜单项和子菜单。
2.addMenu和addAction的使用场景区别
addMenu和addAction是用于在菜单(QMenu)中添加菜单项(QAction)的函数,它们有不同的使用场景和区别。
-
addMenu的使用场景:- 当你想要在菜单中添加一个子菜单时,使用
addMenu是合适的。通过addMenu方法,你可以在当前菜单中创建一个新的子菜单,并返回该子菜单的指针,以便进一步添加菜单项或子菜单。例如:QMenu *fileMenu = menuBar->addMenu("File"); QMenu *editMenu = menuBar->addMenu("Edit"); - 通常情况下,你会使用
addMenu在菜单栏(QMenuBar)或其他菜单(QMenu)中添加子菜单。
- 当你想要在菜单中添加一个子菜单时,使用
-
addAction的使用场景:- 当你想要在菜单中添加一个动作(菜单项)时,使用
addAction是合适的。通过addAction方法,你可以在当前菜单中添加一个动作,并返回该动作的指针,以便进一步设置动作的属性和信号槽。例如:QAction *newAction = fileMenu->addAction("New"); QAction *openAction = fileMenu->addAction("Open"); - 通常情况下,你会使用
addAction在菜单或子菜单中添加动作,以便用户可以执行相应的操作。
- 当你想要在菜单中添加一个动作(菜单项)时,使用
总结:
addMenu适用于在菜单中添加子菜单。addAction适用于在菜单中添加动作(菜单项)。
根据你的需求和菜单结构,选择合适的函数以在菜单中添加菜单项或子菜单。
3.将QAction的信号连接到槽函数
要将QAction的信号连接到槽函数,你需要使用QObject::connect函数。以下是一个示例代码,展示了如何连接QAction的triggered信号到槽函数:
// 假设你有一个名为 action 的 QAction 对象和一个名为 receiver 的接收者对象// 定义槽函数
void MyReceiver::handleAction()
{// 处理 QAction 的触发事件// ...
}// 在连接信号和槽之前,确保接收者对象 receiver 已经存在// 连接信号和槽
QObject::connect(action, &QAction::triggered, receiver, &MyReceiver::handleAction);
在上面的代码中,MyReceiver是接收者类,其中定义了一个名为handleAction的槽函数。action是要连接的QAction对象,receiver是接收者对象的实例。
QObject::connect函数的第一个参数是发送信号的对象,第二个参数是信号的名称,第三个参数是接收者对象,第四个参数是槽函数的名称。你可以使用&ClassName::slotName语法来指定槽函数。
当action的triggered信号被触发时,与之连接的槽函数handleAction将被调用。你可以在槽函数中执行你想要的操作。
请确保在连接信号和槽之前,接收者对象receiver已经被正确创建和初始化。

代码
#include <QApplication>
#include <QMainWindow>
#include <QAction>
#include <QObject>
#include <QDebug>
#include <QMenu>
#include <QMenuBar>// 定义接收者类
class MyReceiver : public QObject
{
public slots:void handleAction(){qDebug() << "Action triggered!";}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建 QMainWindowQMainWindow mainWindow;// 创建 QActionQAction *action = new QAction("My Action", &mainWindow);// 创建接收者对象MyReceiver receiver;// 连接信号和槽QObject::connect(action, &QAction::triggered, &receiver, &MyReceiver::handleAction);// 将 QAction 添加到 QMainWindow 的菜单栏QMenu *menu = mainWindow.menuBar()->addMenu("File");menu->addAction(action);// 显示 QMainWindowmainWindow.show();return app.exec();
}
4.QAction的使用场景
QAction不仅仅适用于菜单中的动作(菜单项),它还可用于其他用户界面元素和交互方式中。
虽然在菜单中添加动作是QAction的常见用法之一,但它也可以用于以下情况:
-
工具栏:
QAction可以用于在工具栏上添加按钮和其他交互元素。你可以将QAction对象添加到QToolBar中,从而在工具栏上创建可点击的按钮。 -
快捷键:
QAction可以与快捷键关联,使用户能够通过键盘快捷方式触发操作。通过setShortcut函数,你可以为QAction指定一个键盘组合,例如Ctrl+C或F5。 -
上下文菜单:
QAction可以与上下文菜单(右键菜单)关联。你可以将QAction添加到QMenu中,并在用户右键单击相关界面元素时显示上下文菜单。 -
工具提示和状态栏:
QAction可以通过设置工具提示和状态栏消息来提供有关操作的附加信息。用户将鼠标悬停在具有关联QAction的界面元素上时,工具提示将显示相应的文本。状态栏消息将在用户执行操作时显示在状态栏上。
总之,QAction是一个通用的用户交互元素,用于表示用户界面中的操作。它可以用于菜单、工具栏、快捷键、上下文菜单和其他需要与用户交互的地方。
5.将例1修改为不使用QMainWindow,使用QWidget

代码
#include <QApplication>
#include <QWidget>
#include <QMenuBar>
#include <QMenu>
#include <QAction>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QMenuBar *menuBar = new QMenuBar(&window);QMenu *fileMenu = menuBar->addMenu("File");QAction *newAction = fileMenu->addAction("New");QAction *openAction = fileMenu->addAction("Open");QMenu *editMenu = menuBar->addMenu("Edit");QAction *cutAction = editMenu->addAction("Cut");QAction *copyAction = editMenu->addAction("Copy");window.show();return app.exec();
}
6.QMenuBar *menuBar = new QMenuBar(&window); 详解
QMenuBar *menuBar = new QMenuBar(&window); 这行代码的详细解释如下:
-
QMenuBar是 Qt 框架中的一个类,用于创建和管理菜单栏(Menu Bar)。 -
&window是一个指向QWidget对象的指针,表示菜单栏的父对象。在这种情况下,我们将菜单栏设置为窗口的子对象,以便在窗口关闭时自动释放菜单栏内存。 -
new QMenuBar(&window)使用new运算符进行动态内存分配,创建了一个QMenuBar对象。通过传递&window作为参数,我们将窗口设置为菜单栏的父对象。 -
QMenuBar *menuBar是一个变量声明,它指定了变量的类型为QMenuBar*即菜单栏的指针类型。 -
=是赋值操作符,用于将new QMenuBar(&window)的返回值赋给menuBar变量。这样,menuBar变量就指向了动态分配的菜单栏对象。
通过使用动态内存分配和指定父对象,我们可以确保在窗口关闭时,菜单栏对象会自动被销毁并释放内存。
总之, QMenuBar *menuBar = new QMenuBar(&window); 这行代码的作用是创建一个 QMenuBar 对象,并将其设置为窗口的菜单栏,并将菜单栏的指针存储在 menuBar 变量中,以便后续对菜单栏进行操作。

相关文章:
qt-C++笔记之addAction和addMenu的区别以及QAction的使用场景
qt-C笔记之addAction和addMenu的区别以及QAction的使用场景 code review! 文章目录 qt-C笔记之addAction和addMenu的区别以及QAction的使用场景1.QMenu和QMenuBar的关系与区别2.addMenu和addAction的使用场景区别3.将QAction的信号连接到槽函数4.QAction的使用场景5.将例1修改…...
nodejs 管道通讯
概述 2个nodejs程序的一种通讯方式,管道通讯,跟其他语言一样,管道通讯是一种特殊的socket通讯,普通的socket通讯是通过监听端口触发通讯机制,管道通讯是通过监听文件的方式进行通讯,一般用于单机的多进程通…...
k8s常用命令及示例(三):apply 、edit、delete
k8s常用命令及示例(三):apply 、edit、delete 1. kubectl apply -f 命令:从yaml文件中创建资源对象。 -f 参数为强制执行。kubectl apply和kubectl create的区别如下:kubectl create 和 kubectl apply 是 Kubernetes 中两个常用的命令&…...
前端页面显示的时间格式为:2022-03-18T01:46:08.000+00:00 如何转换为:年-月-日,并根据当前时间判断为几天前
由于后端每条博文的发表时间是以“xxxx—xx—xxxx:xx:xx”的形式显示的, 现在要在前端改成“xxxx年xx月xx日”的形式。 并对10分钟内发表的显示“刚刚”,对24小时内发表的显示“小时前”。 超过24小时,小于48小时,显示“1天前”。…...
UniGui使用CSS移动端按钮标题垂直
unigui移动端中按钮拉窄以后,标题无法垂直居中,是因为标题有一个padding属性,在四周撑开一段距离。会变成这样: 解决方法,用css修改padding,具体做法如下 首先给button的cls创建一个cls,例如 然后添加css&…...
0-50KHz频率响应模拟量高速信号隔离变送器
0-50KHz频率响应模拟量高速信号隔离变送器 型号:JSD TA-2322F系列 高速响应时间,频率响应时间快 特点: ◆小体积,低成本,标准 DIN35mm 导轨安装方式 ◆六端隔离(输入、输出、工作电源和通道间相互隔离) ◆高速信号采集 (-3dB,Min≤ 3.5 uS,订…...
Linux系统下CPU性能问题分析案例
(上) 本文涉及案例来自于学习极客时间专栏《Linux性能优化实战》精心整理而来,案例总结不到位的请各位多多指正。 某个应用的CPU使用率居然达到100%,我该怎么办? 分析过程 使用观察系统CPU使用情况(并按下…...
【网络协议】LACP(Link Aggregation Control Protocol,链路聚合控制协议)
文章目录 LACP名词解释LACP工作原理互发LACPDU报文确定主动端确定活动链路链路切换 LACP和PAgP有什么区别?LACP与LAG的关系LACP模式更优于手动模式LACP模式对数据传输更加稳定和可靠LACP模式对聚合链路组的故障检测更加准确和有效 推荐阅读 LACP名词解释 LACP&…...
MATLAB 2018一本通 学习笔记一
vivado暂时可以收一下,而且今天看场景和问题的解决程度,这两天看的还是有效果,需要接下来弄一下matlab。 算法开发、数据可视化、数据分析、数值计算方面,之前搞Python弄过matlib库,觉得差不多,但是实际工…...
文献计量学方法与应用、主题确定、检索与数据采集、VOSviewer可视化绘图、Citespace可视化绘图、R语言文献计量学绘图分析
目录 一、文献计量学方法与应用简介 二、主题确定、检索与数据采集 三、VOSviewer可视化绘图 四、Citespace可视化绘图 五、R语言文献计量学绘图分析 六、论文写作 七、论文投稿 更多应用 文献计量学是指用数学和统计学的方法,定量地分析一切知识载体的交叉…...
C#生成微信支付的Authorization签名认证
//获取签名var Token BuildAuthAsync("GET", body, URL);/// <summary>/// 构造签名串/// </summary>/// <param name"method">HTTP请求方式(全大写)</param>/// <param name"body">API接口…...
平台工程与 DevOps 和 SRE 有何不同?
在现代软件开发和运营的动态领域中 ,平台工程、DevOps 和站点可靠性工程 (SRE) 等术语 经常使用,有时可以互换使用,这常常会导致进入或浏览这些领域的专业人员感到困惑。了解这些概念之间的细微差别对于努力构建强大且可扩展的系统的组织至关…...
算法-只出现一次的数字集合
前言 仅记录学习笔记,如有错误欢迎指正。 题目 记录一道面试过的题目 题目如下: 给定一个数组,内容为1-n的数字,其中每个数字只会出现一次或者多次,请在时间复杂度O(n),空间复杂度O(1)的条件下找出所有出现一次的数…...
Linux,Web网站服务(一)
1.准备工作 为了避免发生端口冲突,程序冲突等现象,建议卸载使用RPM方式安装的httpd [rootnode01 ~]# rpm -e http --nodeps 挂载光盘到/mnt目录 [rootnode01 ~]# mount /dev/cdrom /mnt Apache的配置及运行需要apr.pcre等软件包的支持,因此…...
Monkey工具之fastbot-iOS实践
背景 目前移动端App上线后 crash 率比较高, 尤其在iOS端。我们需要一款Monkey工具测试App的稳定性,更早的发现crash问题并修复。 去年移动开发者大会上有参加 fastbot 的分享,所以很自然的就想到Fastbot工具。 Fastbot-iOS安装配置 准备工…...
我想当个程序员
1、为什么当初选择计算机行业 能从事这个行业,也和当时经济情况有关系。 初中开始感兴趣,大学软件工程专业。大四报的android的培训,后来进的对日外包,没想到签合同当天被辞,非技术原因,性格导致。后来回家…...
ACM32如何保护算法、协议不被破解或者修改
ACM32具有以下几种功能,可以保护算法、协议不被破解或者修改。 1.存储保护 RDP读保护 WRP写保护 PCROP 专有代码读保护 MPU存储区域权限控制 Secure User Memory存储区域加密 2.密码学算法引擎 AES HASH 随机数生成 …...
Android Studio(Flutter)常用快捷键
快捷键说明Ctrl Alt M抽取方法Ctrl Alt W抽取组件Alt Enter包裹组件Shift F6重命名Ctrl Alt L代码格式化Ctrl Alt O删除无用importCtrl X删除光标所在行Ctrl D复制一行代码Ctrl C复制Ctrl V粘贴Ctrl Z撤销Ctrl /注释一行代码Ctrl Shift /注释一段代码Ctrl S…...
CSS特效030:日蚀动画
CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…...
746.使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 示例 1…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
