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
的菜单项并返回指向该菜单项的指针