Qt-快速上手-QMenuBar

QMenuBar

头文件:#include <QMenuBar>

QMenuBar:主窗口顶部菜单栏,存放多个 QMenu 菜单;QMainWindow 提供内置 menuBar (),一般不手动 new。

QMenuBar 放 QMenu;QMenu 里面放 QAction。层级关系:QMenuBar → QMenu(菜单) → QAction(菜单项)

常用成员和方法

c++ 复制代码
/**
 * @file QMenuBar
 * @brief 窗口顶部菜单栏,管理多个下拉菜单(QMenu)
 * @details QMenuBar是主窗口顶部的菜单栏控件。
 * QMainWindow自带menuBar()获取内置菜单栏,绝大多数场景直接使用,不需要自己new。
 * 层级:QMenuBar(菜单栏) 包含多个 QMenu(下拉菜单,如"文件"、"编辑");
 * QMenu内部添加 QAction 作为菜单项。
 * @note Windows/macOS平台菜单栏行为略有差异;mac会把菜单栏放到系统顶部。
 * @sa QMenu QAction QMainWindow
 */

/**
 * @class QMenuBar
 * @brief 顶层菜单栏,承载一组下拉菜单
 *
 * ## 层级关系
 * QMenuBar
 * └── QMenu("文件")
 *     ├─ QAction("新建")
 *     ├─ QAction("保存")
 *     └─ QMenu("最近打开") //子菜单
 *
 * ## 常用信号
 * @li triggered(QAction *) 菜单栏中任意一个Action被触发时发出
 * @li hovered(QAction *) 鼠标悬浮在某个菜单项上触发
 */
class QMenuBar : public QWidget
{
public:
    /**
     * @brief 构造菜单栏对象
     * @param parent 父窗口
     * @note QMainWindow优先使用 menuBar() 获取内置菜单栏,不要手动new。
     */
    explicit QMenuBar(QWidget *parent = nullptr);

    /**
     * @brief 添加一个下拉菜单,返回新建的QMenu指针
     * @param title 菜单显示文字,可加&设置Alt快捷键,例如 "&文件",Alt+F打开菜单
     * @return QMenu* 新创建的菜单对象
     * @code
     * QMenu *fileMenu = menuBar()->addMenu("&文件");
     * @endcode
     */
    QMenu *addMenu(const QString &title);

    /**
     * @brief 添加带图标的下拉菜单
     * @param icon 菜单图标
     * @param title 菜单标题文字
     * @return QMenu*
     */
    QMenu *addMenu(const QIcon &icon, const QString &title);

    /**
     * @brief 直接向菜单栏添加一个QAction(顶层Action,极少用)
     * @param action 动作对象
     * @return QAction*
     */
    QAction *addAction(QAction *action);

    /**
     * @brief 添加分隔线,用来把菜单项分组
     * @return QAction* 分隔线对应的action
     */
    QAction *addSeparator();

    /**
     * @brief 设置菜单栏是否可见
     * @param visible true显示,false隐藏整个菜单栏
     */
    void setVisible(bool visible);

    /**
     * @brief 查询菜单栏是否可见
     * @return bool
     */
    bool isVisible() const;

    /**
     * @brief 移除指定菜单,不会释放内存,只是从菜单栏移除
     * @param menu 需要移除的QMenu指针
     */
    void removeMenu(QMenu *menu);

Q_SIGNALS:
    /**
     * @brief 菜单栏中任意QAction被点击触发
     * @param action 被触发的动作对象
     */
    void triggered(QAction *action);

    /**
     * @brief 鼠标悬浮到某一个菜单项
     * @param action 悬浮对应的action
     */
    void hovered(QAction *action);
};
c++ 复制代码
/** 配套 QMenu
 * @class QMenu
 * @brief 下拉菜单,放在QMenuBar或者作为右键弹出菜单
 * @param addAction() 添加QAction菜单项
 * @param addSeparator() 添加分隔线
 * @param addMenu() 添加子菜单
 * @param popup(QPoint pos) 在指定坐标弹出右键菜单
 */

快速上手

练习 1:基础创建菜单栏

需求:

  1. 获取主窗口内置菜单栏 menuBar()
  2. 添加【文件 (&F)】菜单;添加两个 action:新建、保存;保存设置快捷键 Ctrl+S
  3. 添加【编辑 (&E)】菜单;添加 action:复制
  4. 点击保存 action,状态栏输出 "执行保存"
c++ 复制代码
//MainWindow构造函数
QMenuBar *bar = menuBar();
QMenu *fileMenu = bar->addMenu("&文件");

QAction *actNew = new QAction("新建",this);
QAction *actSave = new QAction("保存",this);
actSave->setShortcut(QKeySequence::Save);

fileMenu->addAction(actNew);
fileMenu->addAction(actSave);

QMenu *editMenu = bar->addMenu("&编辑");
QAction *actCopy = new QAction("复制",this);
editMenu->addAction(actCopy);

connect(actSave,&QAction::triggered,this,[=](){
    statusBar()->showMessage("执行保存",3000);
});

练习 2:菜单分隔线 + 子菜单

需求:

在文件菜单中:新建 →【分隔线】→保存;再增加子菜单【最近打开】。

c++ 复制代码
QMenu *fileMenu = menuBar()->addMenu("&文件");
fileMenu->addAction(new QAction("新建",this));
fileMenu->addSeparator(); //分隔线
fileMenu->addAction(new QAction("保存",this));

QMenu *recentMenu = fileMenu->addMenu("最近打开");
recentMenu->addAction("a.txt");
recentMenu->addAction("b.txt");

练习 3:按钮控制菜单栏显示 / 隐藏

需求:两个 QPushButton

  • btnShowBar:显示菜单栏
  • btnHideBar:隐藏整个菜单栏
c++ 复制代码
connect(ui->btnHideBar,&QPushButton::clicked,this,[=](){
    menuBar()->setVisible(false);
    statusBar()->showMessage("菜单栏已隐藏",2000);
});
connect(ui->btnShowBar,&QPushButton::clicked,this,[=](){
    menuBar()->setVisible(true);
    statusBar()->showMessage("菜单栏已显示",2000);
});

练习 4:QMenuBar 总信号 triggered

需求:使用菜单栏的triggered(QAction*)信号,不管点哪个菜单项,状态栏打印该 action 的 text 文本。

c++ 复制代码
connect(menuBar(),&QMenuBar::triggered,this,[=](QAction *act){
    statusBar()->showMessage(QString("点击菜单:%1").arg(act->text()),2500);
});

练习 5:弹出右键菜单(QMenu::popup)

需求:点击按钮,在鼠标当前位置弹出一个独立菜单(不依赖菜单栏,右键弹窗常用)。

c++ 复制代码
connect(ui->btnPopup,&QPushButton::clicked,this,[=](){
    QMenu menu;
    menu.addAction(new QAction("选项A",&menu));
    menu.addAction(new QAction("选项B",&menu));
    menu.popup(QCursor::pos()); //鼠标位置弹出
});
相关推荐
青 春 记 忆1 小时前
零基础入门Python11|Git实战:为任务管理器建立版本历史
开发语言·git·vscode·python·python3.11
余额瞒着我当琳3 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
坐吃山猪3 小时前
WebClient内存配置解析
开发语言·springboot·webflux
jdksjw4 小时前
同步与异步、阻塞与非阻塞、多线程、协程超详细讲解(Python并发编程从入门到精通)
开发语言·python
Zach_菠萝侠4 小时前
【DeepSeek Harness 研究】进化方向4:安全加固 思考、设计与实现
开发语言·安全·deepseek
SL-staff5 小时前
技术实践:HR如何用JVS-Logic可视化编排实现考勤数据同步(含节点配置与异常处理)
开发语言·python·低代码·钉钉·可视化编排·jvs-logic·hr技术
SomeB1oody5 小时前
【RustyML入门】6.0. 数学工具
开发语言·后端·机器学习·rust·教程
进制树6 小时前
【飞控开发实战·⑲】ROS2无人机开发环境搭建:Jazzy安装、工作空间与hello_drone节点实战
开发语言·安全·无人机·课程设计
牛马也想出海6 小时前
亚马逊爬虫代理IP:IP类型选择与配置指南
开发语言·php