本篇介绍Qt菜单栏相关操做,分为三部分:1.菜单栏相关的类介绍;2.系统菜单的生成和响应;3.弹出菜单的生成和响应;菜单栏一般只有以QMainWindow为基类的程序中才用到,以QWidget为基类的程序一般没有菜单栏。函数
QMenuBar --菜单栏类,即下图中红色区域标记,菜单栏类给窗口提供水平菜单栏,此菜单栏占用窗口上方区域,垂直高度不变,水平宽度为窗口宽度,可随窗口大小变化而变化。以下图中“测试”,“test1”,"test2"所在的栏几位QMenuBar测试
QMenu --菜单项,即下图中绿色区域,下图中“测试”,"test1","test2"都是一个独立的菜单,包含各个子菜单。QMenu还能够用来建立弹出菜单。ui
QAction --子菜单,即下图中蓝色区域标记的内容,一个子菜单对应一个操做。this
示例源码:spa
.h文件设计
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include <QMenuBar> 6 7 QT_BEGIN_NAMESPACE 8 namespace Ui { class MainWindow; } 9 QT_END_NAMESPACE 10 11 class MainWindow : public QMainWindow 12 { 13 Q_OBJECT 14 15 public: 16 MainWindow(QWidget *parent = nullptr); 17 ~MainWindow(); 18 19 //菜单栏 20 QMenuBar *pMenuBar; 21 //菜单项 22 QMenu *pMenuTest; 23 QMenu *pMenuTest1; 24 QMenu *pMenuTest2; 25 //子菜单 26 QAction *pActionTest; 27 QAction *pActionTest1; 28 QAction *pActionTest2; 29 QAction *pActionTest3; 30 QAction *pActionTest4; 31 QAction *pActionTest5; 32 QAction *pActionTest6; 33 34 public slots: 35 //菜单响应函数 36 void OnActionTest(); 37 void OnActionTest1(); 38 39 private: 40 Ui::MainWindow *ui; 41 }; 42 #endif // MAINWINDOW_H
.cpp文件code
1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 #include <QDialog> 4 5 //是否启用QMainWindow自带的菜单栏 6 //#define USE_DEFAULT_MENU_BAR 7 8 MainWindow::MainWindow(QWidget *parent) 9 : QMainWindow(parent) 10 , ui(new Ui::MainWindow) 11 { 12 ui->setupUi(this); 13 14 //指定菜单栏 15 #ifdef USE_DEFAULT_MENU_BAR 16 //添加菜单栏(此处添加为的为QMainWindow自带的菜单) 17 pMenuBar = this->menuBar(); 18 #else 19 //添加自定义菜单 20 pMenuBar = new QMenuBar(this); 21 #endif 22 23 //定义菜单项 24 //(&n)表明快捷方式,当窗口得到焦点时按alt+n便可打开“测试”菜单项 25 pMenuTest = new QMenu("测试(&n)",this); 26 pMenuTest1 = new QMenu("test1",this); 27 pMenuTest2 = new QMenu("test2",this); 28 29 //定义子菜单 30 //(&s)为子菜单快捷键,当打开该菜单项后,按下‘s’键便可响应 31 pActionTest = new QAction("测试(&s)",this); 32 //新建一个带图标的菜单项,图标使用资源文件中的资源 33 pActionTest1 = new QAction(QIcon(":/new/prefix1/resource/soccer_ball.ico"),"测试1",this); 34 pActionTest2 = new QAction("测试2",this); 35 pActionTest3 = new QAction("测试3(&Y)",this); 36 pActionTest4 = new QAction("测试4",this); 37 pActionTest5 = new QAction("测试5(&M)",this); 38 pActionTest6 = new QAction("测试6",this); 39 40 //将菜单项添加到子菜单 41 pMenuTest->addAction(pActionTest); 42 pMenuTest->addAction(pActionTest1); 43 //在菜单项之间添加分割线 44 pMenuTest->addSeparator(); 45 pMenuTest->addAction(pActionTest2); 46 47 pMenuTest1->addAction(pActionTest3); 48 pMenuTest1->addAction(pActionTest4); 49 50 pMenuTest2->addAction(pActionTest5); 51 pMenuTest2->addAction(pActionTest6); 52 53 //将子菜单添加到菜单栏 54 pMenuBar->addMenu(pMenuTest); 55 pMenuBar->addMenu(pMenuTest1); 56 pMenuBar->addMenu(pMenuTest2); 57 58 #ifndef USE_DEFAULT_MENU_BAR 59 //当不使用QMainWindow自带的菜单栏时,必需要加上此行 60 setMenuBar(pMenuBar); 61 #endif 62 63 //添加菜单响应函数 64 connect(pActionTest,&QAction::triggered,this,&MainWindow::OnActionTest); 65 connect(pActionTest1,&QAction::triggered,this,&MainWindow::OnActionTest); 66 } 67 68 69 //菜单响应函数 70 void MainWindow::OnActionTest() 71 { 72 QDialog dlg; 73 dlg.setWindowTitle("测试菜单响应"); 74 dlg.exec(); 75 } 76 77 void MainWindow::OnActionTest1() 78 { 79 80 QDialog dlg; 81 dlg.setWindowTitle("测试菜单响应"); 82 dlg.exec(); 83 } 84 85 MainWindow::~MainWindow() 86 { 87 delete ui; 88 }
上面的代码中定义了两种建立系统菜单的方式:调用QMainWindow自带的菜单栏和本身新建菜单栏,由第6行定义的宏控制,显示效果相同。blog
第25行为“测试”子菜单添加快捷键,当窗口得到焦点时按alt+n可展开“测试”子菜单。资源
第31行为“测试”子菜单“测试”菜单项添加快捷键,当“测试”子菜单弹出后按‘s’键,程序便可作出响应。get
第33行为“测试”子菜单的“测试2”菜单项添加了图标。
第44行为“测试”子菜单的“测试2”和“测试3”之间添加了分割线。
进入“设计”页面,进入以下图所示的界面,具体操做方法见以下两张图,注意:输入菜单名称后必定要按“Enter”键才能生效。