Qt基礎之菜單欄

  本篇介紹Qt菜單欄相關操做,分爲三部分:1.菜單欄相關的類介紹;2.系統菜單的生成和響應;3.彈出菜單的生成和響應;菜單欄一般只有以QMainWindow爲基類的程序中才用到,以QWidget爲基類的程序一般沒有菜單欄。函數

1. 菜單相關類

  QMenuBar --菜單欄類,即下圖中紅色區域標記,菜單欄類給窗口提供水平菜單欄,此菜單欄佔用窗口上方區域,垂直高度不變,水平寬度爲窗口寬度,可隨窗口大小變化而變化。以下圖中「測試」,「test1」,"test2"所在的欄幾位QMenuBar測試

  QMenu --菜單項,即下圖中綠色區域,下圖中「測試」,"test1","test2"都是一個獨立的菜單,包含各個子菜單。QMenu還能夠用來建立彈出菜單ui

  QAction --子菜單,即下圖中藍色區域標記的內容,一個子菜單對應一個操做。this

2.系統菜單的生成和響應

2.1.使用代碼添加系統菜單

示例源碼: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」之間添加了分割線。

2.2.使用UI設計器設計系統菜單

  進入「設計」頁面,進入以下圖所示的界面,具體操做方法見以下兩張圖,注意:輸入菜單名稱後必定要按「Enter」鍵才能生效

相關文章
相關標籤/搜索