当前位置: 首页 > news >正文

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的关系与区别

QMenuQMenuBar是Qt中用于创建菜单的两个类,它们之间存在关系和区别。

  1. 关系:

    • QMenuBar是顶层窗口的菜单栏,通常位于窗口的顶部,负责承载和管理菜单。
    • QMenu是菜单栏中的一个菜单项,可以包含子菜单、动作等。

    通常情况下,你会创建一个QMenuBar对象作为主窗口的菜单栏,然后使用addMenu方法添加多个QMenu对象作为菜单栏的菜单项。

  2. 区别:

    • QMenuBar是一个顶级窗口部件,用于承载和管理菜单。它通常只有一个,并且位于主窗口的顶部。
    • QMenu是一个弹出菜单或子菜单,它可以包含多个菜单项(QAction),以及子菜单(另一个QMenu)。

    总的来说,QMenuBar是用于创建和管理菜单栏的部件,而QMenu是用于创建和管理菜单的部件。QMenuBar通常只有一个,用于承载多个QMenu对象,而每个QMenu对象可以包含多个菜单项和子菜单。

以下是一个简单的示例代码,演示了如何创建QMenuBarQMenu
例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对象:FileEdit。每个QMenu对象又通过addAction方法添加了相应的动作(菜单项)。

总结:QMenuBar是用于创建和管理菜单栏的顶级窗口部件,而QMenu是用于创建和管理菜单的部件。QMenuBar可以包含多个QMenu对象作为菜单项,而每个QMenu对象可以包含多个菜单项和子菜单。

2.addMenu和addAction的使用场景区别

addMenuaddAction是用于在菜单(QMenu)中添加菜单项(QAction)的函数,它们有不同的使用场景和区别。

  1. addMenu的使用场景:

    • 当你想要在菜单中添加一个子菜单时,使用addMenu是合适的。通过addMenu方法,你可以在当前菜单中创建一个新的子菜单,并返回该子菜单的指针,以便进一步添加菜单项或子菜单。例如:
      QMenu *fileMenu = menuBar->addMenu("File");
      QMenu *editMenu = menuBar->addMenu("Edit");
      
    • 通常情况下,你会使用addMenu在菜单栏(QMenuBar)或其他菜单(QMenu)中添加子菜单。
  2. addAction的使用场景:

    • 当你想要在菜单中添加一个动作(菜单项)时,使用addAction是合适的。通过addAction方法,你可以在当前菜单中添加一个动作,并返回该动作的指针,以便进一步设置动作的属性和信号槽。例如:
      QAction *newAction = fileMenu->addAction("New");
      QAction *openAction = fileMenu->addAction("Open");
      
    • 通常情况下,你会使用addAction在菜单或子菜单中添加动作,以便用户可以执行相应的操作。

总结:

  • addMenu适用于在菜单中添加子菜单。
  • addAction适用于在菜单中添加动作(菜单项)。

根据你的需求和菜单结构,选择合适的函数以在菜单中添加菜单项或子菜单。

3.将QAction的信号连接到槽函数

要将QAction的信号连接到槽函数,你需要使用QObject::connect函数。以下是一个示例代码,展示了如何连接QActiontriggered信号到槽函数:

// 假设你有一个名为 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语法来指定槽函数。

actiontriggered信号被触发时,与之连接的槽函数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的常见用法之一,但它也可以用于以下情况:

  1. 工具栏:QAction可以用于在工具栏上添加按钮和其他交互元素。你可以将QAction对象添加到QToolBar中,从而在工具栏上创建可点击的按钮。

  2. 快捷键:QAction可以与快捷键关联,使用户能够通过键盘快捷方式触发操作。通过setShortcut函数,你可以为QAction指定一个键盘组合,例如Ctrl+C或F5。

  3. 上下文菜单:QAction可以与上下文菜单(右键菜单)关联。你可以将QAction添加到QMenu中,并在用户右键单击相关界面元素时显示上下文菜单。

  4. 工具提示和状态栏: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); 这行代码的详细解释如下:

  1. QMenuBar 是 Qt 框架中的一个类,用于创建和管理菜单栏(Menu Bar)。

  2. &window 是一个指向 QWidget 对象的指针,表示菜单栏的父对象。在这种情况下,我们将菜单栏设置为窗口的子对象,以便在窗口关闭时自动释放菜单栏内存。

  3. new QMenuBar(&window) 使用 new 运算符进行动态内存分配,创建了一个 QMenuBar 对象。通过传递 &window 作为参数,我们将窗口设置为菜单栏的父对象。

  4. QMenuBar *menuBar 是一个变量声明,它指定了变量的类型为 QMenuBar* 即菜单栏的指针类型。

  5. = 是赋值操作符,用于将 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程序的一种通讯方式&#xff0c;管道通讯&#xff0c;跟其他语言一样&#xff0c;管道通讯是一种特殊的socket通讯&#xff0c;普通的socket通讯是通过监听端口触发通讯机制&#xff0c;管道通讯是通过监听文件的方式进行通讯&#xff0c;一般用于单机的多进程通…...

k8s常用命令及示例(三):apply 、edit、delete

k8s常用命令及示例(三)&#xff1a;apply 、edit、delete 1. kubectl apply -f 命令&#xff1a;从yaml文件中创建资源对象。 -f 参数为强制执行。kubectl apply和kubectl create的区别如下&#xff1a;kubectl create 和 kubectl apply 是 Kubernetes 中两个常用的命令&…...

前端页面显示的时间格式为:2022-03-18T01:46:08.000+00:00 如何转换为:年-月-日,并根据当前时间判断为几天前

由于后端每条博文的发表时间是以“xxxx—xx—xxxx:xx:xx”的形式显示的&#xff0c; 现在要在前端改成“xxxx年xx月xx日”的形式。 并对10分钟内发表的显示“刚刚”&#xff0c;对24小时内发表的显示“小时前”。 超过24小时&#xff0c;小于48小时&#xff0c;显示“1天前”。…...

UniGui使用CSS移动端按钮标题垂直

unigui移动端中按钮拉窄以后&#xff0c;标题无法垂直居中&#xff0c;是因为标题有一个padding属性&#xff0c;在四周撑开一段距离。会变成这样&#xff1a; 解决方法&#xff0c;用css修改padding&#xff0c;具体做法如下 首先给button的cls创建一个cls,例如 然后添加css&…...

0-50KHz频率响应模拟量高速信号隔离变送器

0-50KHz频率响应模拟量高速信号隔离变送器 型号&#xff1a;JSD TA-2322F系列 高速响应时间&#xff0c;频率响应时间快 特点&#xff1a; ◆小体积,低成本,标准 DIN35mm 导轨安装方式 ◆六端隔离(输入、输出、工作电源和通道间相互隔离) ◆高速信号采集 (-3dB,Min≤ 3.5 uS,订…...

Linux系统下CPU性能问题分析案例

&#xff08;上&#xff09; 本文涉及案例来自于学习极客时间专栏《Linux性能优化实战》精心整理而来&#xff0c;案例总结不到位的请各位多多指正。 某个应用的CPU使用率居然达到100%&#xff0c;我该怎么办&#xff1f; 分析过程 使用观察系统CPU使用情况&#xff08;并按下…...

【网络协议】LACP(Link Aggregation Control Protocol,链路聚合控制协议)

文章目录 LACP名词解释LACP工作原理互发LACPDU报文确定主动端确定活动链路链路切换 LACP和PAgP有什么区别&#xff1f;LACP与LAG的关系LACP模式更优于手动模式LACP模式对数据传输更加稳定和可靠LACP模式对聚合链路组的故障检测更加准确和有效 推荐阅读 LACP名词解释 LACP&…...

MATLAB 2018一本通 学习笔记一

vivado暂时可以收一下&#xff0c;而且今天看场景和问题的解决程度&#xff0c;这两天看的还是有效果&#xff0c;需要接下来弄一下matlab。 算法开发、数据可视化、数据分析、数值计算方面&#xff0c;之前搞Python弄过matlib库&#xff0c;觉得差不多&#xff0c;但是实际工…...

文献计量学方法与应用、主题确定、检索与数据采集、VOSviewer可视化绘图、Citespace可视化绘图、R语言文献计量学绘图分析

目录 一、文献计量学方法与应用简介 二、主题确定、检索与数据采集 三、VOSviewer可视化绘图 四、Citespace可视化绘图 五、R语言文献计量学绘图分析 六、论文写作 七、论文投稿 更多应用 文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉…...

C#生成微信支付的Authorization签名认证

//获取签名var Token BuildAuthAsync("GET", body, URL);/// <summary>/// 构造签名串/// </summary>/// <param name"method">HTTP请求方式&#xff08;全大写&#xff09;</param>/// <param name"body">API接口…...

平台工程与 DevOps 和 SRE 有何不同?

在现代软件开发和运营的动态领域中 &#xff0c;平台工程、DevOps 和站点可靠性工程 (SRE) 等术语 经常使用&#xff0c;有时可以互换使用&#xff0c;这常常会导致进入或浏览这些领域的专业人员感到困惑。了解这些概念之间的细微差别对于努力构建强大且可扩展的系统的组织至关…...

算法-只出现一次的数字集合

前言 仅记录学习笔记&#xff0c;如有错误欢迎指正。 题目 记录一道面试过的题目 题目如下&#xff1a; 给定一个数组&#xff0c;内容为1-n的数字&#xff0c;其中每个数字只会出现一次或者多次&#xff0c;请在时间复杂度O(n),空间复杂度O(1)的条件下找出所有出现一次的数…...

Linux,Web网站服务(一)

1.准备工作 为了避免发生端口冲突&#xff0c;程序冲突等现象&#xff0c;建议卸载使用RPM方式安装的httpd [rootnode01 ~]# rpm -e http --nodeps 挂载光盘到/mnt目录 [rootnode01 ~]# mount /dev/cdrom /mnt Apache的配置及运行需要apr.pcre等软件包的支持&#xff0c;因此…...

Monkey工具之fastbot-iOS实践

背景 目前移动端App上线后 crash 率比较高&#xff0c; 尤其在iOS端。我们需要一款Monkey工具测试App的稳定性&#xff0c;更早的发现crash问题并修复。 去年移动开发者大会上有参加 fastbot 的分享&#xff0c;所以很自然的就想到Fastbot工具。 Fastbot-iOS安装配置 准备工…...

我想当个程序员

1、为什么当初选择计算机行业 能从事这个行业&#xff0c;也和当时经济情况有关系。 初中开始感兴趣&#xff0c;大学软件工程专业。大四报的android的培训&#xff0c;后来进的对日外包&#xff0c;没想到签合同当天被辞&#xff0c;非技术原因&#xff0c;性格导致。后来回家…...

ACM32如何保护算法、协议不被破解或者修改

ACM32具有以下几种功能&#xff0c;可以保护算法、协议不被破解或者修改。 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示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…...

746.使用最小花费爬楼梯

给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 示例 1&#xf…...

.NETCore Serilog 代码设置相关参数说明及按Sink设置不同级别(不同日志级别),使用异步方式写日志

rollingInterval设置为RollingInterval.Day与fileSizeLimitBytes配合使用&#xff1a; 在.NET Core Serilog中&#xff0c;同时设置rollingInterval RollingInterval.Day和fileSizeLimitBytes参数并不会产生配置冲突。这两个参数实际上是互补的&#xff0c;共同提供了更灵活的…...

通道注意力与空间注意力【实战篇】

1. 通道注意力实战技巧 第一次在项目中引入通道注意力机制时&#xff0c;我对着论文反复调试了三天才跑通。现在回头看&#xff0c;其实核心代码不到20行&#xff0c;但当时确实踩了不少坑。通道注意力最实用的价值在于&#xff1a;它能自动发现哪些特征通道对当前任务更重要。…...

蓝牙UUID:从标准服务到自定义通信的密钥

1. 蓝牙UUID&#xff1a;智能设备的身份证 想象一下你走进一个满是蓝牙设备的房间——智能手环在测量心率&#xff0c;温湿度计在报告数据&#xff0c;智能灯泡等待你的指令。这些设备如何知道该响应哪个请求&#xff1f;答案就藏在那个128位的UUID&#xff08;通用唯一识别码…...

OpenBot开源代码平台:可视化编程与AI模块开发教程

OpenBot开源代码平台&#xff1a;可视化编程与AI模块开发教程 【免费下载链接】OpenBot OpenBot leverages smartphones as brains for low-cost robots. We have designed a small electric vehicle that costs about $50 and serves as a robot body. Our software stack for…...

Nomic-Embed-Text-V2-MoE实战:构建智能文档检索系统与MySQL集成

Nomic-Embed-Text-V2-MoE实战&#xff1a;构建智能文档检索系统与MySQL集成 1. 引言 想象一下&#xff0c;你所在的公司有成千上万份产品手册、技术文档和合同文件&#xff0c;它们散落在各个文件夹里&#xff0c;格式五花八门。当你想找一份关于“如何解决产品X在低温环境下…...

Remult项目实战:如何从零构建企业级CRM系统的完整流程

Remult项目实战&#xff1a;如何从零构建企业级CRM系统的完整流程 【免费下载链接】remult Full-stack CRUD, simplified, with SSOT TypeScript entities 项目地址: https://gitcode.com/gh_mirrors/re/remult 在当今快速发展的商业环境中&#xff0c;企业级CRM系统已成…...

5步精通MQTT性能测试:从插件部署到高并发压测实践指南

5步精通MQTT性能测试&#xff1a;从插件部署到高并发压测实践指南 【免费下载链接】mqtt-jmeter MQTT JMeter Plugin 项目地址: https://gitcode.com/gh_mirrors/mq/mqtt-jmeter 在物联网应用架构中&#xff0c;MQTT协议以其轻量级特性成为设备通信的首选方案。随着设备…...

从振荡器到稳定电源:用三阶RC滤波电路讲透控制环路的‘稳定’与‘发散’

从振荡器到稳定电源&#xff1a;三阶RC滤波电路揭示控制环路的稳定性本质 想象一下&#xff0c;你正在调试一个看似简单的三阶RC低通滤波电路。当你逐渐增大放大器的增益时&#xff0c;电路突然从安静的滤波状态转变为持续振荡——原本应该衰减高频信号的电路&#xff0c;现在…...

从驱动编译到数据传输:RK3588与FPGA的PCIe通信实战解析

1. RK3588与FPGA的PCIe通信基础 在嵌入式开发中&#xff0c;RK3588作为一款高性能处理器&#xff0c;与FPGA的协同工作越来越常见。PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;作为一种高速串行计算机扩展总线标准&#xff0c;能够提供高带宽、低延…...

InstructPix2Pix真实体验:保留原图结构的智能修图,到底有多好用?

InstructPix2Pix真实体验&#xff1a;保留原图结构的智能修图&#xff0c;到底有多好用&#xff1f; 1. 颠覆传统的修图体验 作为一名长期与图像处理打交道的技术从业者&#xff0c;我第一次使用InstructPix2Pix时的感受可以用"惊艳"来形容。传统的图像编辑工具需要…...