本篇介紹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」鍵才能生效。