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:基础创建菜单栏
需求:
- 获取主窗口内置菜单栏
menuBar() - 添加【文件 (&F)】菜单;添加两个 action:新建、保存;保存设置快捷键 Ctrl+S
- 添加【编辑 (&E)】菜单;添加 action:复制
- 点击保存 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()); //鼠标位置弹出
});

1133


被折叠的 条评论
为什么被折叠?



