Qt窗口控件之菜单栏QMenuBar
菜单栏QMenuBar
1. QMenuBar
Qt 中的菜单栏是通过 QMenuBar
类型来实现的,一个主控件最多只能有一个菜单栏。一个菜单栏可以添加多个菜单,一个菜单又可以添加多个菜单项。
每个菜单又都是一个 QMenu
类型,每个菜单项都是一个 QAction
。
2. 使用代码添加菜单和菜单项
用 setMenuBar()
将 QMenuBar
类型设置为 this
(MainWindow
)的菜单栏,再创建几个 QMenu
,使用 QMenuBar
的 addMenu()
添加菜单,再创建几个 QAction
,使用 QMenu
的 addAction()
将菜单项挂载到对应的菜单上。另外,addSeparator()
可以在菜单项的对应位置添加分割线。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenuBar* menubar=new QMenuBar();
this->setMenuBar(menubar);
QMenu* menu1=new QMenu("文件");
QMenu* menu2=new QMenu("编辑");
QMenu* menu3=new QMenu("构建");
menubar->addMenu(menu1);
menubar->addMenu(menu2);
menubar->addMenu(menu3);
QAction* action1 =new QAction("新建文件");
QAction* action2 =new QAction("打开文件");
QAction* action3 =new QAction("关闭文件");
menu1->addAction(action1);
menu1->addSeparator();
menu1->addAction(action2);
menu1->addAction(action3);
}
MainWindow::~MainWindow()
{
delete ui;
}
3. 菜单快捷设置快捷键方法
在菜单的文本中增加一个 &[字母]
,如:
QMenu* menu = new QMenu("文件(&F)");
则 文件 这个菜单就可以使用快捷键 Alt + F 选中。实际这种快捷键添加方法是 Windows 系统提供的,在很多 Windows 的软件中都可以使用这种方式设置或使用快捷键。
4. 菜单添加子菜单
父菜单的指针使用 addMenu()
就可以将子菜单添加进该父菜单,当鼠标悬停到子菜单上时,就会展开子菜单的菜单项:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenuBar* menubar=new QMenuBar();
this->setMenuBar(menubar);
QMenu* parentMenu=new QMenu("父菜单");
QMenu* childMenu=new QMenu("子菜单");
menubar->addMenu(parentMenu);
parentMenu->addMenu(childMenu);
QAction* action1 =new QAction("子菜单项1");
QAction* action2 =new QAction("子菜单项2");
QAction* action3 =new QAction("子菜单项3");
childMenu->addAction(action1);
childMenu->addAction(action2);
childMenu->addAction(action3);
}
MainWindow::~MainWindow()
{
delete ui;
}
5. 菜单设置图标
注意,如果菜单是长在 QMenuBar
上的(即一级菜单),图标和文字不能同时显示,设置图标的菜单会只有图标能够显示出来。但长在 QMenu
上的二级菜单是能够图标和文字都一起显示的:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenuBar* menubar=new QMenuBar();
this->setMenuBar(menubar);
QMenu* parentMenu=new QMenu("文件");
parentMenu->setIcon(QIcon(":/file.png"));
QMenu* childMenu=new QMenu("文本文件");
childMenu->setIcon(QIcon(":/txt.png"));
menubar->addMenu(parentMenu);
parentMenu->addMenu(childMenu);
}
MainWindow::~MainWindow()
{
delete ui;
}
可以看到 ”文件“ 的图标显示了但是文本消失了。
6. 菜单栏内存泄漏问题
如果 Qt 项目在创建时勾选了使用 ui 生成,那么在项目最开始就已经存在了一个菜单栏,如果我们此时使用代码新建一个 QMenuBar
并将其设置到 this
中,就会导致原有的菜单栏无法被析构释放。所以在自定义菜单栏时,最好使用:
QMenuBar menuBar = this->menuBar();
先获取原有的 QMenuBar
,再使用它更改成我们想要的效果,就可以避免内存泄漏。