【Qt开发】Qt窗口(一) -> 菜单栏
文章目录
- 1 -> 什么是 Qt 窗口
- 2 -> 菜单栏概述
- 3 -> 菜单栏的组成部分与功能
- 4 -> 创建菜单栏
- 5 -> 在菜单栏中添加菜单
- 6 -> 创建菜单项
- 7 -> 在菜单项之间添加分割线
- 8 -> 综合示例
- 9 -> 总结

1 -> 什么是 Qt 窗口
QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了一个预定义的布局。QMainWindow 包含 一个菜单栏(menu bar) 、多个工具栏(tool bars)、多个浮动窗口(铆接部件)(dock widgets)、一个状态栏(status bar) 和一个 中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainWindow 中各组件所处的位置

2 -> 菜单栏概述
在图形用户界面(GUI)应用程序开发中,菜单栏是用户与程序交互的核心组件之一。它通常位于窗口顶部,提供了一系列组织有序的命令和功能入口,使用户能够轻松访问应用程序的各种操作。Qt作为一个跨平台的C++应用程序开发框架,其菜单栏设计不仅直观易用,还体现了现代GUI设计的核心理念——即通过清晰的层次结构提升用户体验。Qt菜单栏不仅仅是功能的集合,它更是一种引导用户探索应用程序能力的桥梁,帮助用户快速理解程序的结构和可用操作。
Qt框架为菜单栏提供了高度集成的支持,使得开发者能够以声明式的方式构建复杂的菜单系统。菜单栏在Qt中通常作为QMenuBar类的实例实现,它与窗口的主布局紧密集成,自动适应不同平台的视觉风格和交互习惯。例如,在Windows系统中,菜单栏可能直接嵌入窗口顶部,而在macOS上,它可能遵循系统全局菜单栏的规范。这种跨平台的适应性是Qt菜单栏的一大优势,确保了应用程序在各种操作系统上都能提供一致且自然的用户体验。
从功能角度来看,Qt菜单栏不仅支持基本的菜单项(如“文件”、“编辑”、“视图”等),还允许集成子菜单、分隔符、快捷键和图标等元素。这些功能使得菜单栏能够以逻辑清晰的方式组织大量命令,避免界面混乱。此外,Qt的信号与槽机制让菜单栏的动作(如点击一个菜单项)能够无缝连接到应用程序的业务逻辑,实现高效的事件处理。这种设计不仅提升了开发效率,还确保了菜单栏的响应性和可维护性。
总的来说,Qt菜单栏是构建专业级应用程序不可或缺的一部分。它通过标准化的组件降低了开发复杂度,同时通过灵活的定制选项满足了多样化的需求。
3 -> 菜单栏的组成部分与功能
Qt 中的 菜单栏是通过QMenuBar这个类来实现的。一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下方。
菜单栏中包含菜单。菜单中包含菜单项。

Qt菜单栏由多个层次化的元素构成,每个元素都承担着特定的角色,共同构建出一个完整且易用的交互界面。首先,菜单栏本身是一个容器,通常包含多个顶级菜单(例如“文件”、“编辑”或“帮助”),每个顶级菜单下又可以进一步包含菜单项、子菜单或分隔符。这种分层结构允许开发者将相关功能分组,从而减少用户的认知负荷。例如,在文本编辑器中,“文件”菜单可能包含“新建”、“打开”、“保存”等操作,而“编辑”菜单则聚焦于“复制”、“粘贴”和“撤销”等功能。这种逻辑分组不仅使界面更整洁,还符合用户的心理模型,让他们能快速定位所需功能。
菜单项是菜单栏中最基本的交互单元,它们代表具体的命令或操作。在Qt中,每个菜单项通常与一个QAction对象关联,该对象封装了项的名称、图标、快捷键以及触发时的行为。例如,当用户点击“保存”菜单项时,关联的QAction会发出一个信号,该信号可以连接到应用程序的保存功能。这种设计使得菜单栏的动作处理变得高度模块化,开发者可以轻松重用同一个动作在多个地方(如菜单栏和工具栏),确保行为的一致性。此外,菜单项可以设置为启用或禁用状态,这在动态界面中非常有用——例如,当没有文档打开时,“保存”菜单项可以自动变为灰色不可用状态,防止用户执行无效操作。
子菜单和分隔符进一步增强了菜单栏的组织性。子菜单允许在单个顶级菜单下嵌套更多选项,适用于功能丰富的应用程序。例如,“视图”菜单可能包含一个“工具栏”子菜单,让用户选择显示或隐藏不同的工具栏。分隔符则用于在视觉上区分不同组的菜单项,避免长列表带来的混乱。Qt还支持快捷键和助记符,让用户可以通过键盘快速访问菜单功能,这对于提高效率至关重要。例如,常见的“Ctrl+S”快捷键对应保存操作,而“Alt+F”可能打开文件菜单。这些特性不仅提升了可用性,还使菜单栏更符合无障碍设计标准。
除了基本功能,Qt菜单栏还支持高级特性如动态菜单更新和上下文菜单集成。动态更新允许菜单内容根据应用程序状态变化,例如在多媒体播放器中,播放菜单可能根据当前媒体类型显示不同的选项。上下文菜单则通过右键点击提供快捷操作,与主菜单栏形成互补。总体而言,Qt菜单栏的组成部分设计精巧,既满足了标准需求,又提供了足够的灵活性以适应复杂场景。
4 -> 创建菜单栏
方式一:菜单栏的创建可以借助于 QMainWindow类提供的menuBar()函数来实现。menubar()函数原型如下:
QMenuBar* menuBar() const
QMenuBar *menubar = menuBar();
this->setMenuBar(menubar);
方式二:在堆上动态创建
// 创建菜单栏
QMenuBar* menuBar = new QMenuBar(this);
this->setMenuBar(menuBar);
使用setMenuBar把菜单栏放到窗口中。
5 -> 在菜单栏中添加菜单
创建菜单,并通过 QMenu 提供的 addMenu() 函数来添加菜单。
// 创建菜单栏
QMenuBar* menuBar = new QMenuBar(this);
this->setMenuBar(menuBar);// 创建菜单
QMenu* menu1 = new QMenu("文件");
QMenu* menu2 = new QMenu("编辑");
QMenu* menu3 = new QMenu("构建");
QMenu* menu4 = new QMenu("调试");
menuBar->addMenu(menu1);
menuBar->addMenu(menu2);
menuBar->addMenu(menu3);
menuBar->addMenu(menu4);
6 -> 创建菜单项
在 Qt 中,并没有专门的菜单项类,可以通过 QAction 类,抽象出公共的动作。如在菜单中添加菜单项。
QAction 可以给菜单栏使用,也可以给工具栏使用。
// 创建菜单项
QAction* action1 = new QAction("新建");
QAction* action2 = new QAction("保存");
QAction* action3 = new QAction("另存为");
QAction* action4 = new QAction("退出");
menu1->addAction(action1);
menu1->addAction(action2);
menu1->addAction(action3);
menu1->addAction(action4);
7 -> 在菜单项之间添加分割线
在菜单项之间可以添加分割线。分割线如下图,添加分割线是通过 QMenu 类提供的 addSeparator() 函数来实现。

// 创建菜单项
QAction* action1 = new QAction("新建");
QAction* action2 = new QAction("保存");
QAction* action3 = new QAction("另存为");
QAction* action4 = new QAction("退出");
menu1->addAction(action1);
menu1->addSeparator();
menu1->addAction(action2);
menu1->addAction(action3);
menu1->addAction(action4);
8 -> 综合示例
在窗口上创建一个菜单栏,在菜单栏中添加一些菜单,在某个菜单中添加一些菜单项。
- 新建 Qt 项目
注意:此时新建项目时选择的基类 QMainWindow

- 在 mainwindow.cpp 文件中创建菜单和中央控件
- 创建一个菜单栏,一个菜单
- 两个菜单项:保存,加载
- 创建一个 QTextEdit 作为窗口的中央控件
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 设置标题this->setWindowTitle("我的记事本");// 创建菜单栏QMenuBar* menuBar = new QMenuBar(this);this->setMenuBar(menuBar);// 创建菜单QMenu* menu = new QMenu("⽂件");menuBar->addMenu(menu);// 创建菜单项QAction* action1 = new QAction("保存");QAction* action2 = new QAction("加载");menu->addAction(action1);menu->addAction(action2);// 创建中央控件edit = new QTextEdit(this);this->setCentralWidget(edit);edit->setPlaceholderText("此处编写⽂本内容...");}
- 给 action 添加一些动作
// 连接信号槽, 点击 action 时触发⼀定的效果.
connect(action1, &QAction::triggered, this, &MainWindow::save);
connect(action2, &QAction::triggered, this, &MainWindow::load);
实现这两个槽函数
- 使用 QFileDialog 来实现选择文件的效果
- getSaveFileName 用于保存文件的场景。此时的对话框可以输入文件名
- getOpenFileName 用于打开文件的场景。此时的对话框可以获取到鼠标选择的文件名
- 搭配 C++标准库 的文件操作实现文件读写
void MainWindow::save()
{// 弹出对话框, 选择写⼊⽂件的路径QFileDialog* dialog = new QFileDialog(this);QString fileName = dialog->getSaveFileName(this, "保存⽂件", "C:/Users/1/");qDebug() << "fileName: " << fileName;// 写⼊⽂件std::ofstream file(fileName.toStdString().c_str());if (!file.is_open()) {qDebug() << "⽂件保存失败!";return;}const QString& text = edit->toPlainText();file << text.toStdString();file.close();
}void MainWindow::load()
{// 弹出对话框, 选择打开的⽂件QFileDialog* dialog = new QFileDialog(this);QString fileName = dialog->getOpenFileName(this, "加载⽂件", "C:/Users/1/");qDebug() << "fileName: " << fileName;// 读取⽂件std::ifstream file(fileName.toStdString().c_str());if (!file.is_open()) {qDebug() << "⽂件加载失败!";return;}std::string content;std::string line;while (std::getline(file, line)) {content += line;content += "\n";}file.close();// 显⽰到界⾯上QString text = QString::fromStdString(content);edit->setPlainText(text);
}
执行程序可以看到此时就可以通过程序来保存/加载文件了。并且对文件进行编辑。

9 -> 总结
Qt窗口的菜单栏是构建现代GUI应用程序的基石,它通过高度结构化的方式将复杂功能呈现给用户,极大地提升了应用程序的可用性和专业性。从概述中我们可以看到,Qt菜单栏不仅仅是一个简单的UI组件,它深度融合了跨平台适应性、模块化设计和用户中心理念。通过QMenuBar和QAction等类的组合,Qt让开发者能够以声明式方法构建菜单系统,同时利用信号与槽机制实现高效的事件处理。这种设计不仅简化了开发流程,还确保了代码的可扩展性和可维护性,使得菜单栏能够随着应用程序功能的增长而灵活调整。
在功能方面,Qt菜单栏支持丰富的元素如菜单项、子菜单、分隔符和快捷键,这些组件共同创造了一个直观的导航体验。菜单项与动作的关联使得同一功能可以在菜单栏、工具栏和上下文菜单中共享,减少了代码冗余并提高了一致性。此外,Qt对动态菜单和状态管理的支持允许菜单内容根据应用程序上下文变化,这在高交互性应用中尤为有用。例如,在文档编辑器中,菜单栏可以动态更新以反映当前选中的内容,提供相关操作选项。
从设计角度来说,成功的Qt菜单栏应当遵循用户中心原则,注重简洁性、一致性和可访问性。通过合理分组菜单项、使用清晰标签并遵循平台规范,开发者可以创造出符合用户期望的界面。同时,国际化支持和无障碍功能的集成确保了菜单栏能服务于全球多样化的用户群体。在实践中,菜单栏还应与其他UI组件(如状态栏和对话框)协同工作,形成一个连贯的交互流。
总之,Qt菜单栏的强大之处在于其平衡了易用性与灵活性。它既提供了开箱即用的标准解决方案,又允许深度定制以满足特定需求。对于任何使用Qt进行GUI开发的开发者来说,掌握菜单栏的设计和实现是至关重要的。通过本文的探讨,我们希望读者能更深入地理解Qt菜单栏的核心价值,并在实际项目中应用这些知识,打造出更加人性化和高效的应用程序。随着Qt框架的持续演进,菜单栏的功能和性能还将进一步提升,为未来应用程序的创新奠定坚实基础。
感谢各位大佬支持!!!
互三啦!!!
