目录
菜单栏
例子:创建菜单栏、菜单、菜单项
例子:给菜单设置快捷键
例子:给菜单项设置快捷键
例子:添加子菜单
例子:添加分隔线
例子:添加图标
菜单栏
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如果是子菜单,则文本和图标都会进行显示。