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…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
