Qt-快速上手-QMenuBar

QMenuBar

头文件:#include <QMenuBar>

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

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

常用成员和方法

/**
 * @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);
};
/** 配套 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,状态栏输出 “执行保存”
//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:菜单分隔线 + 子菜单

需求:

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

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:隐藏整个菜单栏
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 文本。

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

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

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

connect(ui->btnPopup,&QPushButton::clicked,this,[=](){
    QMenu menu;
    menu.addAction(new QAction("选项A",&menu));
    menu.addAction(new QAction("选项B",&menu));
    menu.popup(QCursor::pos()); //鼠标位置弹出
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值