1 //mainwindow.h 2 #ifndef MAINWINDOW_H 3 #define MAINWINDOW_H 4 5 #include <QMainWindow> 6 class Action;//所用到的類的前置聲明 7 class MenuBar; 8 class QMenu; 9 class QWidget; 10 11 class MainWindow : public QMainWindow 12 { 13 Q_OBJECT 14 public: 15 MainWindow(QWidget* parent = 0); 16 private: 17 void createMenuBar(); 18 private: 19 MenuBar *menu; 20 QMenu *fileMenu, 21 *editMenu, 22 *helpMenu; 23 }; 24 25 class MenuBar:public QWidget{ 26 Q_OBJECT 27 public: 28 MenuBar(QWidget* parent); 29 ~MenuBar(); 30 public slots: 31 void ignore(); 32 public: 33 //Menu "File" 34 QMenu *fileMenu; 35 QAction *newAction, 36 *openAction, 37 *closeAction; 38 //Menu "Edit" 39 QMenu *editMenu; 40 QAction *cutAction, 41 *copyAction, 42 *pasteAction; 43 //Menu "Help" 44 QMenu *helpMenu; 45 QAction *aboutAction, 46 *aboutQtAction; 47 }; 48 #endif // MAINWINDOW_H
1 #include "mainwindow.h" 2 #include<QWidget> 3 #include<QMenu> 4 #include<QMenuBar> 5 #include<QAction> 6 7 MainWindow::MainWindow(QWidget *parent) : 8 QMainWindow(parent) 9 { 10 this->setWindowTitle(tr("Main Window")); 11 this->createMenuBar(); 12 } 13 14 void MainWindow::createMenuBar() 15 { 16 menu = new MenuBar(this); 17 menuBar()->addMenu(menu->fileMenu); 18 menuBar()->addMenu(menu->editMenu); 19 menuBar()->addMenu(menu->helpMenu); 20 } 21 22 //====================================================== 23 MenuBar::MenuBar(QWidget* parent) 24 { 25 fileMenu = new QMenu(QObject::tr("File"),parent); 26 newAction = new QAction(QObject::tr("New"),parent); 27 openAction = new QAction(QObject::tr("Open"),parent); 28 closeAction = new QAction(QObject::tr("Close"),parent); 29 fileMenu->addAction(newAction); 30 fileMenu->addAction(openAction); 31 fileMenu->addAction(closeAction); 32 33 editMenu = new QMenu(QObject::tr("Edit"),parent); 34 cutAction = new QAction(QObject::tr("Cut"),parent); 35 copyAction = new QAction(QObject::tr("Copy"),parent); 36 pasteAction = new QAction(QObject::tr("Paste"),parent); 37 editMenu->addAction(cutAction); 38 editMenu->addAction(copyAction); 39 editMenu->addAction(pasteAction); 40 41 helpMenu = new QMenu(QObject::tr("Help"),parent); 42 aboutAction = new QAction(QObject::tr("About"),parent); 43 aboutQtAction = new QAction(QObject::tr("About Qt"),parent); 44 helpMenu->addAction(aboutAction); 45 helpMenu->addAction(aboutQtAction); 46 } 47 48 void MenuBar::ignore() 49 {} 50 MenuBar::~MenuBar() 51 { 52 delete newAction; 53 delete openAction; 54 delete closeAction; 55 delete cutAction; 56 delete copyAction; 57 delete pasteAction; 58 delete aboutAction; 59 delete aboutQtAction; 60 newAction = 0; 61 openAction = 0; 62 closeAction = 0; 63 cutAction = 0; 64 copyAction = 0; 65 pasteAction = 0; 66 aboutAction = 0; 67 aboutQtAction = 0; 68 }
上述代碼就是為一個窗口創建菜單的代碼
首先是 實例化一個 MainWindow 窗口類的對象 , 在該類的構造函數中 , 又實例化了一個 MenuBar 類的 對象 ,
從代碼中可以看出 MenuBar類的主要最用 就是創建 菜單欄上的菜單項 和 每個菜單向所包含的子菜單項 ,
以及 每個子菜單項所對應的 action , 並通過 addAction 動作 , 將 每個子菜單項 添加到 主菜單項 上
菜單項 和 其子菜單項 都創建好了 並且關聯到了一起 , 接下來就是將其都添加到菜單欄上了。
接着MainWindow的構造函數 調用 createMenuBar() 成員 函數。
該函數的作用就是創建一個菜單欄 ,並將菜單項添加到菜單欄上
基本過程是 先調用 menuBar() 該函數在程序中第一次被調用的時候會為窗口創建一個菜單欄 ,並返回指向該菜單欄的指針,
然后就可以通過 QMenu* QMenuBar::addMenu() ; 函數來將每個子菜單項添加到菜單欄上了。 當程序運行的時候,菜單欄就會在窗口上顯示出來
當想創建多級菜單的時候, 如 File->Open->aaa->bbb->.....這樣的菜單的時候 , 只要使用相應菜單項的指針來調用 addMenu() 成員函數即可 ,
這樣就會創建多級菜單
注: 當調用 menuBar()->addMenu(const QString & menuItem) 而不是 menuBar()->addMenu(QMenu *) 的時候 , 菜單欄會自動創建一個 名為 menuItem
的菜單項並返回指向該菜單項的指針