Qt窗口——QMenuBar

文章目录

    • QMenuBar
    • 示例演示
    • 给菜单栏设置快捷键
    • 给菜单项设置快捷键
    • 添加子菜单
    • 添加分割线
    • 添加图标

QMenuBar

Qt中采用QMenuBar来创建菜单栏,一个主窗口,只允许有一个菜单栏,位于主窗口的顶部、主窗口标题栏下面;一个菜单栏里面有多个菜单QMenu;菜单里面有菜单项QAction

在这里插入图片描述

QAction不仅仅在菜单里使用,还在工具栏里使用,工具栏的本质,就是菜单中一些选项的“快捷方式”

image-20240917151447658

示例演示

创建一个餐单栏,添加菜单,给菜单添加菜单项

创建工程的时候选择的是QMainWindow了,因为要创建窗口

image-20240917151733556

ui界面:

image-20240917152954287

这里有一个Bug,就是在ui界面设置菜单项的时候,中文无法输入(可以通过复制粘贴),这有点麻烦

代码创建:

关于QMenuBar的创建方式:

QMenuBar* menuBar = new QMenuBar();
this->setMenuBar(menuBar);

如果在创建项目的时候,没有勾选自动创建ui文件,上述代码没问题;

如果勾选了自动生成ui文件,就会造成内存泄漏,因为我们这个操作会代替旧的menubar,旧的没有释放。

QMenuBar* menuBar = this->menuBar();
this->setMenuBar(menuBar);

QMenuBar* menuBar = this->menuBar();表示如果QMenuBar()存在,则直接获取;如果不存在,就创建一个新的再返回

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建菜单栏
    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);  //添加到对象树

    //创建菜单
    QMenu* menu1 = new QMenu("文件");
    QMenu* menu2 = new QMenu("编辑");
    QMenu* menu3 = new QMenu("构建");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);

    //添加菜单项
    QAction* action1 = new QAction("新建");
    QAction* action2 = new QAction("打开");
    QAction* action3 = new QAction("关闭");
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addAction(action3);
    
    //添加信号槽
    connect(action1, &QAction::trigger, this, &MainWindow::handle);
    connect(action3, &QAction::trigger, this, &MainWindow::close);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handle()
{
    qDebug() << "触发新建操作";
}

菜单项被点击的时候,会触发一个信号triggered,可以设置对应的槽函数,来响应操作

GIF 2024-9-17 16-51-19

给菜单栏设置快捷键

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);
    
    QMenu* menu1 = new QMenu("文件(&F)");
    QMenu* menu2 = new QMenu("编辑(&E)");
    QMenu* menu3 = new QMenu("构建(&B)");
    QMenu* menu4 = new QMenu("调试(&D)");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);
    menuBar->addMenu(menu4);
    
    QAction* action1 = new QAction("新建");
    QAction* action2 = new QAction("撤销");
    QAction* action3 = new QAction("构建项目");
    QAction* action4 = new QAction("开始调试");
    
    menu1->addAction(action1);
    menu2->addAction(action2);
    menu3->addAction(action3);
    menu4->addAction(action4);
}

MainWindow::~MainWindow()
{
    delete ui;
}

这里构建的时候直接加上& 键位即可,然后就可以通过alt + 键位触发

和给QLabel设置伙伴类似

GIF 2024-9-17 17-08-36

给菜单项设置快捷键

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);

    QMenu* menu1 = new QMenu("文件(&F)");
    QMenu* menu2 = new QMenu("编辑(&E)");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);

    QAction* action1 = new QAction("新建(&N)");
    QAction* action2 = new QAction("打开(&O)");
    QAction* action3 = new QAction("撤销(&Z)");

    menu1->addAction(action1);
    menu1->addAction(action2);
    menu2->addAction(action3);

    connect(action1, &QAction::triggered, this, &MainWindow::handle1);
    connect(action2, &QAction::triggered, this, &MainWindow::handle2);
    connect(action3, &QAction::triggered, this, &MainWindow::handle3);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handle1()
{
    qDebug() << "新建";
}

void MainWindow::handle2()
{
    qDebug() << "打开";
}

void MainWindow::handle3()
{
    qDebug() << "撤销";
}

GIF 2024-9-17 17-17-18

添加子菜单

image-20240917172027803

QMenu也提供了addMenu,给菜单项添加子菜单

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);

    QMenu* menu1 = new QMenu("父菜单");
    QMenu* menu1_1 = new QMenu("子菜单");
    menuBar->addMenu(menu1);
    menu1->addMenu(menu1_1);

    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");
    menu1_1->addAction(action1);
    menu1_1->addAction(action2);
}

MainWindow::~MainWindow()
{
    delete ui;
}

image-20240917172504228

添加分割线

如果菜单项特别多,可以通过`add分割线进行分组,让用户看的更清楚

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);
    QMenu* menu1 = new QMenu("菜单1");
    QMenu* menu2 = new QMenu("菜单2");
    QMenu* menu3 = new QMenu("菜单3");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);

    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");
    QAction* action3 = new QAction("菜单项3");
    QAction* action4 = new QAction("菜单项4");

    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addSeparator();  //添加分割线
    menu1->addAction(action3);
    menu1->addSeparator();
    menu1->addAction(action4);

}

MainWindow::~MainWindow()
{
    delete ui;
}

image-20240917173025970

添加图标

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);
    QMenu* menu1 = new QMenu("菜单1");
    QMenu* menu2 = new QMenu("菜单2");
    QMenu* menu3 = new QMenu("菜单3");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);

    QAction* action1 = new QAction("kun");
    action1->setIcon(QIcon(":/ikun.png"));
    QAction* action2 = new QAction("篮球");
    action2->setIcon(QIcon(":/ikun2.png"));

    menu1->addAction(action1);
    menu1->addAction(action2);

}

MainWindow::~MainWindow()
{
    delete ui;
}

通过qrc机制导入图像,然后再进行设置

QMenu设置图标:

  • 如果是长在QMenuBar上文字就没有了,直接显示图标
  • 如果是子菜单,都显示

image-20240917173655496

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

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

相关文章

【Linux实践】实验三:LINUX系统的文件操作命令

【Linux实践】实验三&#xff1a;LINUX系统的文件操作命令 实验目的实验内容实验步骤及结果1. 切换和查看目录2. 显示目录下的文件3. 创建和删除目录① mkdir② rm③ rmdir 4. 输出和重定向① 输出② 重定向 > 和 >> 5. 查看文件内容① cat② head 6. 权限7. 复制8. 排…

科大讯飞智能体Python SDK接入流程

第一步&#xff1a;注册账号​ 进入https://passport.xfyun.cn/login&#xff0c;根据提示注册或登陆账号。 ​ 第二步&#xff1a;创建智能体 进入这个网页创建智能体&#xff0c;填好信息&#xff1a; https://xinghuo.xfyun.cn/botcenter/createbot?createtrue&qu…

【GeekBand】C++设计模式笔记4_Strategy_策略模式

1. “组件协作”模式 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”&#xff0c;“组件协作”模式通过晚期绑定&#xff0c;来实现框架与应用程序之间的松耦合&#xff0c;是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event 2.…

Webpack 介绍

Webpack 介绍 Date: August 29, 2024 全文概要 Webpack概念&#xff1a; Webpack是一个静态的模块化的打包工具&#xff0c;可以为现代的 JavaSript 应用程序进行打包。 1-静态&#xff1a;Webpack可以将代码打包成最终的静态资源 2-模块化&#xff1a;webpack支持各种模块…

408选择题笔记|自用|随笔记录

文章目录 B树&#xff1a;访问节点建堆&#xff01;将结点插入空堆广义指令求每个子网可容纳的主机数量虚拟内存的实现方式文件目录项FCB和文件安全性管理级别索引文件三种存取方式及适用器件成组分解访问磁盘次数 C语言标识符 最小帧长物理传输层介质 局域网&广域网考点总…

云计算课程作业1

作业1 Xmanager连接 rhel连接 作业2 首先确认你的虚拟机设置的是NAT 1-3 然后打开这篇blog&#xff0c;并完成第一步和第二步 因为我们是NAT&#xff0c;所以不需要连接网桥&#xff0c;即跳过第三步&#xff0c;但是这里ping一下测试网络连接 2- 如果到这里你发现提示yum…

echarts 导出pdf空白原因

问题阐述 页面样式&#xff1a; 导出pdf: 导出pdf&#xff0c;统计图部分为空白。 问题原因 由于代码中进行了dom字符串的复制&#xff0c;而echarts用canvas绘制&#xff0c;canvas内部内容不会进行复制&#xff0c;只会复制canvas节点&#xff0c;因此导出pdf空白。 解决…

【CPU】CPU的物理核、逻辑核、超线程判断及L1、L2、L3缓存、CacheLine和CPU的TBL说明

CPU物理核及L1、L2、L3及缓存 CPU缓存 CPU 缓存是一种用于存储临时数据以提高计算机程序性能的内存层次结构。它通常分为三个层次&#xff1a;L1&#xff08;一级&#xff09;、L2&#xff08;二级&#xff09;和L3&#xff08;三级&#xff09;缓存。缓存大小是CPU的重…

spring-boot、spring-cloud、spring-cloud-alibaba的常用依赖的依赖声明及pom文件

copy自若依 父工程pom文件&#xff0c;主要定义了依赖的版本号 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…

【unity进阶知识1】最详细的单例模式的设计和应用,继承和不继承MonoBehaviour的单例模式,及泛型单例基类的编写

文章目录 前言一、不使用单例二、普通单例模式1、单例模式介绍实现步骤&#xff1a;单例模式分为饿汉式和懒汉式两种。 2、不继承MonoBehaviour的单例模式2.1、基本实现2.2、防止外部实例化对象2.3、最终代码 3、继承MonoBehaviour的单例模式3.1、基本实现3.2、自动创建和挂载单…

每日刷题(算法)

目录 我们N个真是太厉害了 思路&#xff1a; 代码&#xff1a; 折返跑 思路&#xff1a; 代码&#xff1a; 好好好数 思路&#xff1a; 代码&#xff1a; 魔法之森的蘑菇 思路&#xff1a; 代码&#xff1a; 我们N个真是太厉害了 思路&#xff1a; 我们先给数组排序…

安全常用的kali linux是怎样的,如何安装?

黑客或者安全在用的kali linux是怎样&#xff0c;安装 kali Linux的历史 Kali Linux由Offensive Security公司维护,可以追溯到BackTrack Linux这个著名的渗透测试发行版。BackTrack于2006年首次发布,基于Knoppix,集成了许多安全工具。它因功能强大而深受安全研究人员的喜爱。…

keepalived+lvs集群

目录 一、环境 二、配置 1、master 1.在master上安装配置Keepalived 2.在master上修改配置文件 2、backup 1.在backup&#xff08;192.168.229.12&#xff09;上安装keepalived 2.在backup上修改配置文件 3、master和backup上启动服务 4、web服务器配置 1.web1和web…

【计算机网络篇】物理层

本文主要介绍计算机网络第二章节的物理层&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 文章目录 &#x1f3af;一.基本概念及公式 &#x1f383;基本概念…

Python编码系列—Python模板方法模式:定义算法骨架,让子类实现细节

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

MySQL 主从复制部署与优化

文章目录 前言 在现代数据库管理中&#xff0c;MySQL 主从复制是一种关键技术&#xff0c;用于提高数据的可用性和性能。随着 Docker 容器技术的普及&#xff0c;利用 Docker 搭建 MySQL 主从复制环境已成为一种趋势&#xff0c;它提供了一种简便、高效且可扩展的解决方案。本…

【全网最全】2024年华为杯研赛A题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024年华为杯研赛A题保奖思路matlab/py代码成品论文等&#xff08;后续会更新完整 点击链接加入【2024华为杯研赛资料汇总】&#xff1a;https:…

Leetcode尊享面试100题-252.会议室

给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;请你判断一个人是否能够参加这里面的全部会议。 示例 1&#xff1a; 输入&#xff1a;intervals [[0,30],[5,10],[15,20]] 输出&#xff…

代码随想录算法训练营第三十九天 | 198.打家劫舍 ,213.打家劫舍II,337.打家劫舍III

第三十九天打卡&#xff0c;今天解决打家劫舍系列问题&#xff0c;树形dp比较难。 198.打家劫舍 题目链接 解题过程 dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]。 要么不偷这一间&#xff0c;那就是前面那间…

SQL面试常见题目

SQL面试常见题目涉及多个方面&#xff0c;包括数据查询、数据操作、表的设计与优化等。以下列举一些经典的SQL面试题目&#xff0c;并附上解析答案&#xff1a; 1. 查询一张表中重复的数据 题目&#xff1a; 给定一个表 employees&#xff0c;包含 id, name, salary 列。如何…