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

  的菜单项并返回指向该菜单项的指针

 

 

 

posted on 2013-06-04 20:38  wowk  阅读(4213)  评论(0编辑  收藏  举报