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

    // 创建 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 变量中,以便后续对菜单栏进行操作。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新能源汽车生产污废水需要哪些工艺及设备

新能源汽车的快速发展带来了许多环境问题&#xff0c;其中之一就是生产过程中产生的污废水。由于新能源汽车的生产过程与传统汽车有所不同&#xff0c;因此需要采用特定的工艺和设备来处理和处理这些废水。 首先&#xff0c;新能源汽车生产过程中产生的污废水主要来自洗涤和冷却…

【稳定检索|投稿优惠】2024年机电控制系统与机械工程国际会议(ICMECSME 2024)

2024年机电控制系统与机械工程国际会议(ICMECSME 2024) 2024 International Conference on Mechanical and Electrical Control Systems and Mechanical Engineering(ICMECSME) 一、【会议简介】 2024年智慧交通与城市建设工程国际会议(ICSTUCE 2024)将在中国广州盛大开幕。这场…

C语言——字符函数和字符串函数(二)

&#x1f4dd;前言&#xff1a; 上一篇文章C语言——字符函数和字符串函数&#xff08;一&#xff09;对字符函数和字符串函数strlen&#xff0c;strcpy和strncpy&#xff0c;strcat和strncat进行了初步的讲解 这篇文章主要再讲解几个我们常用到的其他字符串函数&#xff08;附…

2023-12-14 二叉树的最大深度和二叉树的最小深度以及完全二叉树的节点个数

二叉树的最大深度和二叉树的最小深度以及完全二叉树的节点个数 104. 二叉树的最大深度 思想&#xff1a;可以使用迭代法或者递归&#xff01;使用递归更好&#xff0c;帮助理解递归思路&#xff01;明确递归三部曲–①确定参数以及返回参数 ②递归结束条件 ③单层逻辑是怎么样…

JavaWeb项目中已经导入依赖却报错依赖不存在

问题描述 在使用 Maven Servlet Tomcat 来搭建 JavaWeb 项目时&#xff0c;在 pom.xml 中正确引入了依赖&#xff0c;编码过程中也能够正常使用。但是在启动 Tomcat 之后&#xff08;启动时或启动后&#xff09;&#xff0c;却报错显示该依赖不存在。 可能原因 pom.xml 的…

项目篇 | 图书管理系统 | 图像加载与绘制

项目篇 | 图书管理系统 | 图像加载与绘制 基本介绍 首先解释清楚什么叫图像加载与绘制,意思就是说项目中需要用到一些图片资源(各种图标),我们要在图书管理系统中展示这些图片,就需要先导入图片到项目中,再加载图片资源(通过资源路径)、绘制图片(即展示)。 注:如果…

恢复Django 项目

随笔记录 目录 1. 重建Mysql DB 2. 启动Django 项目 2.1 确保你的系统上已安装pip工具。你可以使用以下命令来检查pip是否已安装 2.2 安装Packages 2.2.1 安装Django 2.2.2 安装pymysql 2.2.3 安装 kafka 2.2.4 安装 requests 2.2.5 安装simplepro 2.2.6 安装libjp…

亿赛通电子文档安全管理系统 SQL注入漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

【深度学习】强化学习(五)深度强化学习

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数7、深度强化学习1. 背景与动机2. 关键要素3. 成功案例4. 挑战和未来展望5. 核心概念和方法总结 一、强化学习问题 强化学…

如何用 Cargo 管理 Rust 工程系列 甲

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/ceMTUzRjDoiLwjn_KfZSrg 这几年 Rust 可谓是炙手可热的新兴编程语言了&#xff0c;而且被投票为最受程序员喜爱的语言。它很现代&#xff0c;专门…

GitHub Universe 2023 Watch Party in Shanghai:在开源世界中找到真我

文章目录 ⭐ 前言⭐ “我”的开源之旅⭐ 为什么要做开源⭐ 要如何做好开源⭐ 开源的深度影响⭐ 小结 ⭐ 前言 周末有幸参加了在上海举行的 GitHub Universe 2023 Watch Party&#xff0c;这是一个充满激情和活力的开源开发者日。我有幸聆听了一场特别令人印象深刻的演讲&#…

Linux,Windows或macOS系统的电脑怎样才能投屏到手机?

很多人都知道手机投屏到电脑的方法&#xff0c;但想要反过来的时候&#xff0c;却束手无策。 如果你想要将电脑投屏到手机&#xff0c;无论你的电脑是Windows&#xff0c;Linux还是macOS系统&#xff0c;无论你的手机是安卓、iOS还是鸿蒙&#xff0c;都可以用下面这个方法实现电…

深度探索Linux操作系统 —— Linux图形原理探讨

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 深度探索Linux操作系统 —— 构建根文件系统…

老杨说运维 | 年末大盘点!擎创CEO实时盘点运维大干货,不容错过

2023年即将走到尾声&#xff0c;对于擎创而言&#xff0c;这一年是颇具成长和成就的一年。我们庆幸获得了更多客户的信任&#xff0c;也为他们达到下一个运维阶段提供了充足的助力。 越多的实践就会带来越多新的理解和可优化的经验。这一年来&#xff0c;擎创在运维数据治理、智…

Java的struts2+MySQL+jsp实现登录、注册以及文件上传

Java的struts2MySQLjsp实现登录、注册以及文件上传 项目结构 项目所需jar包文件 jar包下载地址&#xff1a;https://download.csdn.net/download/qq_43001132/88629520 数据库设计SQL CREATE TABLE db_users ( id INT(10) NOT NULL AUTO_INCREMENT, username VARCHAR(50) …

50种css常用的代码(实用)

目录 1、文字超出部分显示省略号 2、中英文自动换行 3、文字阴影 4、设置placeholder的字体样式 5、不固定高宽 div 垂直居中的方法 6、设置滚动条样式 7、实现隐藏滚动条同时又可以滚动 8、创建渐变背景 9、悬停效果&#xff08;Hover&#xff09; 10、改变链接的样…

Unity | Shader基础知识(第五集:案例<小彩球>)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、原理分析 1 现实中出现彩色的原因 2 软件里的彩色的原理 3 方案 三、 实现数字由【-1,1】映射为【0,1】 1 结论 2 原理 四、代码实现 1 注意事项 2 详解结构体appdata_base 3 接收数据 4 映射数据 5 输出给SV_TAR…

如何在Facebook Business Manager进行企业认证

Facebook Business Manager&#xff0c;简称BM&#xff0c;按照字面意思理解就是Facebook官方的商务管理平台&#xff0c;是供广告主团队去使用的一个管理工具。BM可以绑定Facebook公共主页、广告账户等一系列Facebook账号。通过BM&#xff0c;企业就可以在一个后台&#xff0c…

三层交换机原理与配置

文章目录 三层交换机原理与配置一、三层交换技术概述二、传统的 MLS三、基于CEF 的MLS1、转发信息库&#xff08;FIB&#xff09;2、邻接关系表3、工作原理&#xff1a; 四、三层交换机的配置1、三层交换机配置命令2、三层交换机配置步骤 三层交换机原理与配置 一、三层交换技…

新手卖家如何入局独立站?看这一篇就够了

作为卖家如果有心入局搭建跨境独立站&#xff0c;先要了解清楚什么是独立站&#xff1f;优势是什么&#xff1f;再去思考如何入局独立站&#xff1f; 一、什么是独立站&#xff1f; 独立站&#xff0c;顾名思义&#xff0c;就是一个独立的网站&#xff0c;它不受限于任何平台&a…