qt-C++笔记之addAction和addMenu的区别以及QAction的使用场景

news2024/12/23 18:57:31

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);

    // 创建 QMainWindow
    QMainWindow mainWindow;

    // 创建 QAction
    QAction *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);

    // 显示 QMainWindow
    mainWindow.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 变量中,以便后续对菜单栏进行操作。

在这里插入图片描述

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

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

相关文章

用串口给stm32下载程序

由于开发板没有预留swd下载口&#xff0c;于时在网上找教程用串口给开发板下载。 记录一下。 好文推荐&#xff1a; 如何使用串口来给STM32下载程序 - 知乎 (zhihu.com) 驱动安装&#xff1a; CH340&#xff1a;CH340/CH341USB转串口WINDOWS驱动程序 PL2302&#xff1a;…

【论文解读】ICLR 2024高分作:ViT需要寄存器

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2309.16588 摘要&#xff1a; Transformer最近已成为学习视觉表示的强大工具。在本文中&#xff0c;我们识别并表征监督和自监督 ViT 网络的特征图中的伪影。这些…

Axure的动态面板的使用

目录 1.什么是动态面板&#xff1f; 2.使用动态面板 ​编辑 轮播图 erp的登录系统 erp侧边栏 1.什么是动态面板&#xff1f; 动态面板是Axure的高级交互元件&#xff0c;由不同的状态面板组成&#xff0c;是我们制作交互过程中运用频率最高的元件&#xff0c;很多交互效果需…

Intewell-Hyper I_V2.0.0_release版本正式发布

新型工业操作系统_Intewell-Hyper I_V2.0.0_release版本正式发布 软件发布版本信息 版本号&#xff1a;V2.0.0 版本发布类型&#xff1a;release正式版本 版本特点 1.建立Intewell-Hyper I基线版本 版本或修改说明 基于Intewell-Lin V2.3.0_release版本&#xff1a; 1.Devel…

GaussDB如何创建和管理视图

GaussDB如何创建和管理视图 一、什么是视图 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣&#xff0c;而又不想每次键入这些查询时&#xff0c;用户就可以定义一个视图&#xff0c;以便解决这个问题。 视图与基本表不同&#xff0c;不是物理上实际存在的&#x…

LeetCode刷题--- 二叉树的所有路径

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 【 http://t.csdnimg.cn/yUl2I 】 【C】 【 http://t.csdnimg.cn/6AbpV 】 数据结构与算法 【 http://t.csdnimg.cn/hKh2l 】 前言&…

云原生向量计算引擎 PieCloudVector:为大模型提供独特记忆

拓数派大模型数据计算系统&#xff08;PieDataComputingSystem&#xff0c;缩写&#xff1a;πDataCS&#xff09;在10月24日程序员节「大模型数据计算系统」2023拓数派年度技术论坛正式发布。πDataCS 以云原生技术重构数据存储和计算&#xff0c;「一份存储&#xff0c;多引擎…

2021年数维杯国际大学生数学建模B题极端降雨的定量分析求解全过程文档及程序

2021年数维杯国际大学生数学建模 B题 极端降雨的定量分析 原题再现&#xff1a; 近两年来&#xff0c;我国河南、陕西、湖北等地遭遇了极为罕见的暴雨。与此同时&#xff0c;北方一些城市遭遇了历史上罕见的暴风雪。这些暴雨和降雪对当地人民的生命、安全和财产构成严重威胁。…

不知道CRM系统怎么选?这十款值得推荐

许多想要购买CRM软件的客户都因为市场上产品数量众多而不知从何下手。因此&#xff0c;我们以企业实力、品牌荣誉、企业在行业内的排名情况&#xff0c;结合网络口碑等多种因素为基础&#xff0c;为国内CRM软件建立了以下排行榜&#xff0c;并重点介绍排行榜前十的CRM软件供应商…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(三)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

智能优化算法应用:基于平衡优化器算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于平衡优化器算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于平衡优化器算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.平衡优化器算法4.实验参数设定5.算法…

Leetcode—1502.判断能否形成等差数列【简单】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—1502.判断能否形成等差数列 实现代码 class Solution { public:bool canMakeArithmeticProgression(vector<int>& arr) {sort(arr.begin(), arr.end());int diff abs(arr[1] - arr[0]);for(int i 1; i <…

PyQt6 表单布局Form Layout (QFormLayout)

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计43条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

react经验7:高亮关键字

预期效果&#xff1a; 实现原理 将需要高亮的关键词做成正则表达式 new RegExp((${word}), "gi")使用上述正则表达式切割目标字符串 origin.split(new RegExp((${word}), "gi"))切割结果会包含正则匹配到的词 过滤掉空字符&#xff0c;并对关键词包裹…

实在智能“数字员工”荣获工信部赛宝信创“全栈优秀解决方案奖”

近日&#xff0c;由工信部和中国通信企业协会主办的“2023&#xff08;第四届&#xff09;数字化转型推动高质量发展大会”在海口成功举办&#xff0c;大会现场重磅发布了中国赛宝信息技术应用创新优秀解决方案获奖名单&#xff0c;实在智能《信创RPA-统计局数智办公解决方案》…

24年五年制专转本招生院校有可能发生变动

据悉&#xff0c;24年五年制专转本院校可能将发生改变&#xff0c;南京传媒学院有可能停止招生 将新增一所招生大学&#xff1a;南京航空航天大学金城学院 南京航空航天大学金城学院始建于1999年&#xff0c;是南京航空航天大学联合社会力量创办的独立学院。学校位于江苏省南京…

Vue学习计划-Vue2--VueCLi(五)全局事件总线、消息订阅与发布(pubsub)

抛出问题:我们多级组件&#xff0c;或者任意不想关的子组件如何传递数据呢&#xff1f; 1. 全局事件总线&#xff08;$bus&#xff09; 一种组件间通信的方式&#xff0c;适用于任意组件间通信 全局事件总线示意图&#xff1a; 安装全局事件总线&#xff1a; new Vue({..…

代码随想录二刷 | 二叉树 | 110.平衡二叉树

代码随想录二刷 &#xff5c; 二叉树 &#xff5c; 110.平衡二叉树 题目描述解题思路递归迭代 代码实现递归法迭代法 题目描述 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉…

首发卡密引流系统源码

程序特色&#xff1a; 支持个人和企业小程序广告获取卡密。 支持短视频点赞和关注获取卡密。 搭建教程&#xff1a; 环境要求&#xff1a;Nginx、MySQL 5.6、PHP 5.6 步骤&#xff1a; 将压缩包解压至网站根目录。 打开域名/install&#xff0c;按照提示填写数据库信息进行…

【Android】使用 Glide 给 ImageView 加载图像的简单案例

前言 Android Glide是一个用于在Android应用中加载和显示图片的流行开源库。它提供了简单易用的API&#xff0c;可以帮助开发者高效地加载远程图片、本地图片以及GIF动画&#xff0c;并提供了缓存、内存管理等功能&#xff0c;使得图片加载在移动应用中更加流畅和高效。Glide还…