Qt窗口控件之菜单栏QMenuBar

server/2025/3/26 0:56:43/

菜单栏QMenuBar

1. QMenuBar

Qt 中的菜单栏是通过 QMenuBar 类型来实现的,一个主控件最多只能有一个菜单栏。一个菜单栏可以添加多个菜单,一个菜单又可以添加多个菜单项。

每个菜单又都是一个 QMenu 类型,每个菜单项都是一个 QAction

QMenuBar1

2. 使用代码添加菜单和菜单项

setMenuBar()QMenuBar 类型设置为 thisMainWindow)的菜单栏,再创建几个 QMenu ,使用 QMenuBaraddMenu() 添加菜单,再创建几个 QAction ,使用 QMenuaddAction() 将菜单项挂载到对应的菜单上。另外,addSeparator() 可以在菜单项的对应位置添加分割线。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menubar=new QMenuBar();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->addSeparator();menu1->addAction(action2);menu1->addAction(action3);}MainWindow::~MainWindow()
{delete ui;
}

QMenuBar2

3. 菜单快捷设置快捷键方法

在菜单的文本中增加一个 &[字母] ,如:

QMenu* menu = new QMenu("文件(&F)");

文件 这个菜单就可以使用快捷键 Alt + F 选中。实际这种快捷键添加方法是 Windows 系统提供的,在很多 Windows 的软件中都可以使用这种方式设置或使用快捷键。

4. 菜单添加子菜单

父菜单的指针使用 addMenu() 就可以将子菜单添加进该父菜单,当鼠标悬停到子菜单上时,就会展开子菜单的菜单项:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menubar=new QMenuBar();this->setMenuBar(menubar);QMenu* parentMenu=new QMenu("父菜单");QMenu* childMenu=new QMenu("子菜单");menubar->addMenu(parentMenu);parentMenu->addMenu(childMenu);QAction* action1 =new QAction("子菜单项1");QAction* action2 =new QAction("子菜单项2");QAction* action3 =new QAction("子菜单项3");childMenu->addAction(action1);childMenu->addAction(action2);childMenu->addAction(action3);}MainWindow::~MainWindow()
{delete ui;
}

QMenuBar3

5. 菜单设置图标

注意,如果菜单是长在 QMenuBar 上的(即一级菜单),图标和文字不能同时显示,设置图标的菜单会只有图标能够显示出来。但长在 QMenu 上的二级菜单是能够图标和文字都一起显示的:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menubar=new QMenuBar();this->setMenuBar(menubar);QMenu* parentMenu=new QMenu("文件");parentMenu->setIcon(QIcon(":/file.png"));QMenu* childMenu=new QMenu("文本文件");childMenu->setIcon(QIcon(":/txt.png"));menubar->addMenu(parentMenu);parentMenu->addMenu(childMenu);
}MainWindow::~MainWindow()
{delete ui;
}

QMenuBar4

可以看到 ”文件“ 的图标显示了但是文本消失了。

6. 菜单栏内存泄漏问题

如果 Qt 项目在创建时勾选了使用 ui 生成,那么在项目最开始就已经存在了一个菜单栏,如果我们此时使用代码新建一个 QMenuBar 并将其设置到 this 中,就会导致原有的菜单栏无法被析构释放。所以在自定义菜单栏时,最好使用:

QMenuBar menuBar = this->menuBar();

先获取原有的 QMenuBar ,再使用它更改成我们想要的效果,就可以避免内存泄漏。


http://www.ppmy.cn/server/179104.html

相关文章

深入理解 HTML5 Web Workers:提升网页性能的关键技术解析

深入理解 HTML5 Web Workers&#xff1a;提升网页性能的关键技术解析 引言1. 什么是 Web Workers&#xff1f;Web Workers 的特点&#xff1a; 2. Web Workers 的使用方式2.1 创建一个 Web Worker步骤 1&#xff1a;创建 Worker 文件步骤 2&#xff1a;在主线程中调用 Worker 3…

蓝桥杯,冬奥大抽奖

在日常的网页开发中&#xff0c;抽奖功能是一种常见的交互设计&#xff0c;它可以增加用户的参与感和趣味性。今天&#xff0c;我将分享一个简单的抽奖转盘实现&#xff0c;它使用了HTML、CSS和JavaScript&#xff0c;非常适合初学者学习和理解前端开发的基本概念。 一、项目背…

北京交通大学第三届C语言积分赛

作者有言在先&#xff1a; 题解的作用是交流思路&#xff0c;不是抄作业的。可以把重点放在思路分析上而不是代码上&#xff0c;毕竟每个人的代码风格是不一样的&#xff0c;看别人的代码就跟做程序填空题一样。先看明白思路再看代码。 还有就是&#xff0c;deepseek真的很好用…

AI进化论:从图灵测试到智能革命的临界点

智能觉醒的起源密码(1943-2010) 在曼彻斯特维多利亚大学的实验室里,1948年"Baby"计算机完成人类首个存储程序运行实验时,艾伦图灵正在构思《计算机器与智能》。这篇划时代论文提出的"模仿游戏"测试,为人工智能奠定了哲学基础。1956年达特茅斯会议…

期权交易投资怎么操作?新手期权操作指南

期权就是股票&#xff0c;唯一区别标的物上证指数&#xff0c;会看大盘吧&#xff0c;新手做期权交易两个方向认购做多&#xff0c;认沽做空&#xff0c;双向t0交易没了&#xff0c;跟期货一样&#xff0c;对的&#xff0c;玩的也是合约&#xff0c;唯一区别没有保证金不会爆仓…

Stable Diffusion lora训练(一)

一、不同维度的LoRA训练步数建议 2D风格训练 数据规模&#xff1a;建议20-50张高质量图片&#xff08;分辨率≥10241024&#xff09;&#xff0c;覆盖多角度、多表情的平面风格。步数范围&#xff1a;总步数控制在1000-2000步&#xff0c;公式为 总步数 Repeat Image Epoch …

Django项目入门

Django项目入门 目录 1.html模板语法继承 2.表格设计(models) 3.实现部门的添加删除功能 一、html模板语法继承 比如说, 我们想要index.html继承model_tmp.html, 我们就需要用到模板继承。 用法: 语法是{% block 自定义名称 %}, 后面再跟上{% endblock %}。 model_tmp…

【群晖NAS】git常见问题解决方法

在使用群晖nas的时候&#xff0c;我们可能会使用到git仓库&#xff0c;但是会出现如下问题&#xff1a; 问题一&#xff1a; 原因是&#xff0c;我们在git程序中没有给该用户进行授权&#xff0c;授权后该问题即可解决&#xff01; 问题二&#xff1a; 出现没有权限&#xff0…