(5)框架搭建:Qt实战项目之主窗体菜单栏
各位同学,今天我们开始Qt实战项目的菜单栏(Menu Bar)的构建。菜单栏是桌面应用中最基础的交互组件之一,Qt提供了完善的类来实现它,我们主要围绕QMenuBar、QMenu和QAction这三个核心类展开讲解。
核心类介绍
在Qt中构建菜单栏,离不开以下三个类:
1. QMenuBar
菜单栏的容器,通常位于窗口顶部。一个主窗口(QMainWindow)默认会自带一个菜单栏,可通过menuBar()方法获取,无需手动创建。它的作用是管理多个QMenu(菜单)。
2. QMenu
菜单本身,比如“文件” “帮助”这些都是QMenu实例。它可以包含子菜单(嵌套QMenu)或QAction(菜单项)。
3. QAction
菜单项的“动作”,比如“文件”菜单下的“新建”“打开”“保存”。QAction不仅可以放在菜单中,还能关联到工具栏按钮、快捷键等,是Qt中“动作抽象”的核心类。
菜单实战
实战内容
接着前面章节所创建的空白项目,为该项目添加菜单栏功能,具体规划如下:
1、菜单栏整体包含两个一级菜单,分别为 “文件” 和 “帮助”。
2、“文件” 菜单下需设置三个菜单项:
- “新建项目”:用于触发新建项目的相关操作
- “打开项目”:用于触发打开已有项目的相关操作
- “退出”:用于关闭应用程序
3、“帮助” 菜单下需设置一个菜单项:
- “关于”:用于展示应用程序的版本信息等内容

温馨提示:本章实战核心是带大家熟悉菜单栏的基础构建流程,重点掌握 QMenuBar、QMenu、QAction 等核心类的使用与层级关联。由于信号与槽机制尚未讲解,各菜单项(如 “新建项目”“退出”“关于”)的具体功能逻辑本章仅做简单示意,对应的完整实现将在后续专门章节中详细拆解演示。
实战步骤
头文件引入
首先在我们的主窗口类的头文件SubCfgTool.h中引入一下构建菜单栏所需要的三个类QMenuBar、QMenu、QAction。
考虑到菜单栏包含的菜单及菜单项较多,为使代码结构更清晰、职责更单一,我们将单独定义一个createMenuBar()函数,集中编写菜单栏的所有构建逻辑(包括菜单创建、菜单项添加、快捷键设置等)。这样既便于后续维护,也能让主窗口的构造函数更简洁。
#pragma once#include <QtWidgets/QMainWindow>
//#include "ui_SubCfgTool.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>class SubCfgTool : public QMainWindow
{Q_OBJECTpublic:SubCfgTool(QWidget *parent = nullptr);~SubCfgTool();void createMenuBar();private:// Ui::SubCfgToolClass ui;
};
createMenuBar()的实现
当首次调用menuBar()时,若主窗口尚未关联菜单栏,Qt 会自动创建一个新的QMenuBar并关联到主窗口。
// 菜单栏QMenuBar* menuBar = this->menuBar();
然后定义两个菜单QMenu,分别是文件、帮助。
我们可以参考一下官方文档的类库(All C++ Classes | Qt 6.9),在其中找到QMenuBar类并查看其公共方法。

文档中明确QMenuBar提供了addMenu方法用于创建菜单,因此我们可以按如下方式实现:
// 菜单
QMenu* fileMenu = menuBar->addMenu("文件");
QMenu* helpMenu = menuBar->addMenu("帮助");
温馨提示:Qt 官方类库文档是开发过程中的核心参考工具,能为各类组件的使用提供权威指导。后续开发中,建议大家主动结合官方文档,深入了解各类的属性、方法及使用场景,这会让开发过程更高效、更规范。
接下来我们定义菜单项,并添加到相应的菜单中,可以通过addSeparator()添加分割线。
// 定义文件菜单中的菜单项
QAction *createProjAct = new QAction("新建项目");
QAction* openProjAct = new QAction("打开项目");
QAction* quitAct = new QAction("退出");
// 将菜单项加入到文件菜单
fileMenu->addAction(createProjAct);
fileMenu->addAction(openProjAct);
fileMenu->addSeparator();
fileMenu->addAction(quitAct);// 定义帮助菜单中的菜单项
QAction* aboutAct = new QAction("关于");
// 将菜单加入到帮助菜单项
helpMenu->addAction(aboutAct);
编译运行测试效果
在 Qt 开发中,当源码文件包含中文(如中文菜单名等)时,若编码格式设置不当,可能会导致编译报错(如语法错误)或运行时显示乱码。而Qt 对 UTF-8 编码有原生且完善的支持,且 UTF-8 是跨平台(Windows/Linux/macOS)的通用编码,能最大限度避免中文相关问题。所以编译之前我们先更改一下SubCfgTool.cpp的编码格式,可通过“高级保存选项”进行更改,步骤如下:


温馨提示:如果找不到这个菜单,可以按照以下步骤操作:进入“工具”>“自定义”,选择“命令”选项卡,在“菜单栏”中选择“文件”,然后点击“添加命令”按钮。在弹出的窗口中,选择“文件”类别和“高级保存选项”命令,然后点击确定即可。
编译运行之前,记得在构造函数中调用createMenuBar()。不出意外的话,编译运行后你会在窗口顶部看到我们刚刚自定义的 “文件” 和 “帮助” 菜单。点击菜单展开看看,里面的 “新建项目”“打开项目”“退出” 和 “关于” 这些菜单项应该都能正常显示。
添加菜单项快捷键
我们来尝试为菜单添加快捷键,这需要用到成员函数 setShortcut。
首先来看 setShortcut 的参数,查阅官方文档中 QAction 类的 setShortcut 方法可知,其参数涉及 QKeySequence 类,通过该类我们能了解到快捷键的标准定义方式如下图所示,我们这里会用到Open和New两个标准的快捷键。

将这两个快捷键分别绑定在我们的“新建项目”、“打开项目”菜单上:
// 添加快捷键
createProjAct->setShortcut(QKeySequence::New);
openProjAct->setShortcuts(QKeySequence::Open);
下面绑定一个临时的响应函数来测试快捷键是否生效:
// 临时测试代码,按下新建项目,输出打印一行信息
connect(createProjAct, &QAction::triggered, []() {qDebug() << "Create New Project"; });
编译运行程序,当我们按下快捷键Ctrl+N的时候,会输出Create New Project,但是我们发现如果按住鼠标不松开,会一直持续的打印,这个时候如果我们需要防止这种情况的话,可以设置菜单项的SetAutoRepeat为false。这个函数是控制键盘的组合快捷键是否重复执行。
createProjAct->setAutoRepeat(false);
添加菜单项图标
如果觉得菜单有些单调,我们可以为菜单加上图标,让界面更直观生动。在 Qt 中,为菜单动作(QAction)添加图标主要通过 setIcon() 方法实现。QAction 提供了 setIcon(const QIcon &icon) 成员函数,用于为动作设置图标。
准备好图标文件,在代码的工程目录下创建一个image目录,将图标文件放入其中。

然后将图标文件加入 Qt 资源系统(.qrc),避免程序运行时依赖外部文件路径。在解决方案资源管理器中直接双击打开qrc文件,可以看到图标文件的管理界面。

点击“Add >>Add Files”加入图标文件并保存,同时点击指定的图标也可以看到图标的Resource URL路径,如下:

使用资源路径就可以为菜单设置图标了,如下:
createProjAct->setIcon(QIcon(":/SubCfgTool/image/menu_new.png"));
openProjAct->setIcon(QIcon(":/SubCfgTool/image/menu_open.png"));
编译运行看看效果吧。

本章节聚焦 Qt 菜单栏的构建核心,我们已熟练掌握菜单栏(QMenuBar)、菜单(QMenu)与动作(QAction)的层级关联,清晰理解了通过代码创建菜单结构、添加菜单项的完整流程。
在后续学习中,我们将进一步拓展 Qt 界面框架的其他关键部分,重点探索工具栏(QToolBar)的搭建与使用逻辑,深入理解其与 QAction 的复用机制,最终实现菜单与工具栏的高效联动,让界面交互更具连贯性。
附录
SubCfgTool.h代码:
#include <QtWidgets/QMainWindow>
//#include "ui_SubCfgTool.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>class SubCfgTool : public QMainWindow
{Q_OBJECTpublic:SubCfgTool(QWidget *parent = nullptr);~SubCfgTool();void createMenuBar();private:// Ui::SubCfgToolClass ui;
};
SubCfgTool.cpp代码:
#include "SubCfgTool.h"SubCfgTool::SubCfgTool(QWidget *parent): QMainWindow(parent)
{// ui.setupUi(this);createMenuBar();
}SubCfgTool::~SubCfgTool()
{}void SubCfgTool::createMenuBar()
{// 菜单栏QMenuBar* menuBar = this->menuBar();// 菜单QMenu* fileMenu = menuBar->addMenu("文件");QMenu* helpMenu = menuBar->addMenu("帮助");// 定义文件菜单中的菜单项QAction* createProjAct = new QAction("新建项目");QAction* openProjAct = new QAction("打开项目");QAction* quitAct = new QAction("退出");// 将菜单项加入到文件菜单fileMenu->addAction(createProjAct);fileMenu->addAction(openProjAct);fileMenu->addSeparator();fileMenu->addAction(quitAct);// 定义帮助菜单中的菜单项QAction* aboutAct = new QAction("关于");// 将菜单加入到帮助菜单项helpMenu->addAction(aboutAct);// 添加快捷键createProjAct->setShortcut(QKeySequence::New);openProjAct->setShortcuts(QKeySequence::Open);createProjAct->setAutoRepeat(false);// 临时测试代码connect(createProjAct, &QAction::triggered, []() {qDebug() << "Create New Project"; });// 设置图标createProjAct->setIcon(QIcon(":/SubCfgTool/image/menu_new.png"));openProjAct->setIcon(QIcon(":/SubCfgTool/image/menu_open.png"));}
