目录
菜单栏
例子:创建菜单栏、菜单、菜单项
例子:给菜单设置快捷键
例子:给菜单项设置快捷键
例子:添加子菜单
例子:添加分隔线
例子:添加图标
菜单栏
Qt中的菜单栏是通过QMenuBar这个类实现的,一个主窗口最多只有一个菜单栏,位于主窗口顶部、主窗口标题栏下面。
- 菜单栏中包含菜单,菜单中包含菜单项
打开Qt,此时需要将Base class更改为QMainWindow.
进行Qt Designer,看到QMainWindow与QWidget的区别:
在菜单栏中创建新的菜单,运行程序:
在菜单中添加菜单项,运行程序:
例子:创建菜单栏、菜单、菜单项
(1)编写代码,创建菜单栏,并将菜单栏设置到窗口。
(2)编写代码,创建菜单,并将菜单添加到菜单栏
(3)编写代码,创建菜单项,并将菜单项添加到菜单中
(4)编写代码,点击“退出”,触发信号 triggered ,并退出
(5)运行程序
(6)代码展示
#include "mainwindow.h"
#include "ui_mainwindow.h"
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("工具");
QMenu* menu4 = new QMenu("帮助");
menuBar->addMenu(menu1);
menuBar->addMenu(menu2);
menuBar->addMenu(menu3);
menuBar->addMenu(menu4);
// 创建菜单项,并将菜单项添加到菜单中
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);
// 编写退出信号
connect(action4, &QAction::triggered, this, &QMainWindow::close);
}
MainWindow::~MainWindow()
{
delete ui;
}
例子:给菜单设置快捷键
给菜单和菜单项设置快捷键,设置好快捷键就可以搭配alt来进行使用了。
(1)创建菜单栏、菜单、菜单项
(2)添加快捷键
通过给文本中添加 &F 这样的操作,就是添加了快捷键alt + F。
(在之前没有图形化界面的时候,文本编辑器都是靠类似风格的快捷键来进行操作的)
同时,也可以使用QShortCut来实现类似的效果,但是太过麻烦。
(3)执行程序
最后&这个符号,并不会在界面上显示
(4)代码展示
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建菜单栏,并将菜单栏设置到窗口
QMenuBar* menuBar = new QMenuBar();
this->setMenuBar(menuBar);
// 创建菜单,将菜单添加到菜单栏
QMenu* menu1 = new QMenu("文件 (&F)");
QMenu* menu2 = new QMenu("编辑 (&E)");
QMenu* menu3 = new QMenu("视图 (&V)");
QMenu* menu4 = new QMenu("关于 (&A)");
menuBar->addMenu(menu1);
menuBar->addMenu(menu2);
menuBar->addMenu(menu3);
menuBar->addMenu(menu4);
// 创建菜单项,将菜单项添加到菜单里面
QAction* action1 = new QAction("菜单项1");
QAction* action2 = new QAction("菜单项2");
QAction* action3 = new QAction("菜单项3");
QAction* action4 = new QAction("菜单项4");
menu1->addAction(action1);
menu2->addAction(action2);
menu3->addAction(action3);
menu4->addAction(action4);
}
MainWindow::~MainWindow()
{
delete ui;
}
例子:给菜单项设置快捷键
(1)创建菜单栏、菜单、菜单项
(2)给菜单项添加快捷键
(3)执行项目
(4)代码展示
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建菜单栏,并将菜单设置在窗口
QMenuBar* menuBar = new QMenuBar();
this->setMenuBar(menuBar);
// 创建菜单,并将菜单添加到菜单栏
QMenu* menu1 = new QMenu("文件(&F)");
QMenu* menu2 = new QMenu("编辑(&E)");
QMenu* menu3 = new QMenu("关于(&A)");
menuBar->addMenu(menu1);
menuBar->addMenu(menu2);
menuBar->addMenu(menu3);
// 创建菜单项,并将菜单项添加到菜单
QAction* action1 = new QAction("菜单项1(&Z)");
QAction* action2 = new QAction("菜单项2(&X)");
QAction* action3 = new QAction("菜单项3(&C)");
QAction* action4 = new QAction("菜单项4(&V)");
menu1->addAction(action1);
menu1->addAction(action2);
menu1->addAction(action3);
menu1->addAction(action4);
}
MainWindow::~MainWindow()
{
delete ui;
}
例子:添加子菜单
菜单栏->菜单->菜单项
菜单栏->菜单->子菜单->子菜单->菜单项
QMenu 类也提供了addMenu()这个函数,以便添加子菜单。
(1)创建菜单栏,菜单
(2)在菜单1中添加子菜单1和菜单项
(3)在子菜单1中添加子菜单
(4)运行程序
(5)代码展示
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 菜单栏
QMenuBar* menuBar = new QMenuBar();
this->setMenuBar(menuBar);
// 菜单
QMenu* menu1 = new QMenu("菜单1");
QMenu* menu2 = new QMenu("菜单2");
QMenu* menu3 = new QMenu("菜单3");
menuBar->addMenu(menu1);
menuBar->addMenu(menu2);
menuBar->addMenu(menu3);
// 在菜单1中添加子菜单与菜单项
QMenu* menuChild1 = new QMenu("子菜单1");
QMenu* menuChild2 = new QMenu("子菜单2");
QMenu* menuChild3 = new QMenu("子菜单3");
menu1->addMenu(menuChild1);
menu1->addMenu(menuChild2);
menu1->addMenu(menuChild3);
QAction* action1 = new QAction("菜单项1");
QAction* action2 = new QAction("菜单项2");
QAction* action3 = new QAction("菜单项3");
menu1->addAction(action1);
menu1->addAction(action2);
menu1->addAction(action3);
// 在子菜单1中添加子菜单与菜单项
QMenu* menuChildChild1 = new QMenu("子菜单11");
QMenu* menuChildChild2 = new QMenu("子菜单12");
QMenu* menuChildChild3 = new QMenu("子菜单13");
menuChild1->addMenu(menuChildChild1);
menuChild1->addMenu(menuChildChild2);
menuChild1->addMenu(menuChildChild3);
QAction* action11 = new QAction("菜单项11");
QAction* action12 = new QAction("菜单项12");
QAction* action13 = new QAction("菜单项13");
menuChild1->addAction(action11);
menuChild1->addAction(action12);
menuChild1->addAction(action13);
}
MainWindow::~MainWindow()
{
delete ui;
}
例子:添加分隔线
在菜单中,菜单项如果比较多,就可以通过分割线进行分组。
在QMenu中,提供了addSeparator函数进行菜单项的分隔。
(1)创建菜单栏,菜单及俩个菜单项
(2)在俩个菜单项之间使用addSeparator函数添加分割线
(3)执行程序
(4)代码展示
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建菜单栏,菜单及俩个菜单项
QMenuBar* menuBar = new QMenuBar();
this->setMenuBar(menuBar);
QMenu* menu = new QMenu("菜单");
menuBar->addMenu(menu);
QAction* action1 = new QAction("菜单项1");
QAction* action2 = new QAction("菜单项2");
menu->addAction(action1);
// 在俩个菜单项之间使用addSeparator函数添加分割线
menu->addSeparator();
menu->addAction(action2);
}
MainWindow::~MainWindow()
{
delete ui;
}
例子:添加图标
使用QIcon中的setIcon()函数进行添加图标。
(1)创建菜单栏、菜单和俩个菜单项
(2)将准备好的图标添加在所在文件
(3)给菜单添加图标
(4)给俩个菜单项添加图标
(5)执行程序
(6)代码展示
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 设置菜单栏、菜单和俩个菜单项
QMenuBar* menuBar = new QMenuBar();
this->setMenuBar(menuBar);
QMenu* menu = new QMenu("文件");
menuBar->addMenu(menu);
// 给菜单添加图标
menu->setIcon(QIcon(":/icon/file.png"));
QAction* action1 = new QAction("新建");
QAction* action2 = new QAction("打印");
menu->addAction(action1);
// 给新建添加图标
action1->setIcon(QIcon(":/icon/new.png"));
menu->addAction(action2);
// 给打印添加图标
action2->setIcon(QIcon(":/icon/print.png"));
}
MainWindow::~MainWindow()
{
delete ui;
}
如果给QMenu设置图标,当前QMenu是在QMenuBar上的,此时文本就不会显示,图标会覆盖文本;而QMenu如果是子菜单,则文本和图标都会进行显示。