在前面的QMainWindow的基礎之上,咱們開始着手建造咱們的應用程序。雖然如今已經有一個框架,可是,確切地說咱們還一行代碼沒有寫呢!下面的工做就不那麼簡單了!在這一節裏面,咱們要爲咱們的框架添加菜單和工具條。
就像Swing裏面的Action同樣,Qt裏面也有一個相似的類,叫作QAction。顧名思義,QAction類保存有關於這個動做,也就是action的信息,好比它的文本描述、圖標、快捷鍵、回調函數(也就是信號槽),等等。神奇的是,QAction可以根據添加的位置來改變本身的樣子——若是添加到菜單中,就會顯示成一個菜單項;若是添加到工具條,就會顯示成一個按鈕。這也是爲何要把菜單和按鈕放在一節裏面。下面開始學習!
首先,我想添加一個打開命令。那麼,就在頭文件裏面添加一個私有的QAction變量:
注意,不要忘記QAction類的前向聲明哦!要不就會報錯的!
而後咱們要在cpp文件中添加QAction的定義。爲了簡單起見,咱們直接把它定義在構造函數裏面:

openAction =
new QAction(tr(
"&Open"),
this);

openAction->setShortcut(QKeySequence::Open);

openAction->setStatusTip(tr(
"Open a file."));
第一行代碼建立一個QAction對象。QAction有幾個重載的構造函數,咱們使用的是

QAction(
const QString &text, QObject* parent);
這一個。它有兩個參數,第一個text是這個動做的文本描述,用來顯示文本信息,好比在菜單中的文本;第二個是parent,通常而言,咱們一般傳入this指針就能夠了。咱們不須要去關心這個parent參數具體是什麼,它的做用是指明這個QAction的父組件,當這個父組件被銷燬時,好比delete或者由系統自動銷燬,與其相關聯的這個QAction也會自動被銷燬。
若是你仍是不明白構造函數的參數是什麼意思,或者說想要更加詳細的瞭解QAction這個類,那麼就須要本身翻閱一下它的API文檔。前面說過有關API的使用方法,這裏再也不贅述。這也是學習Qt的一種方法,由於Qt是一個很大的庫,咱們不可能面面俱到,所以只爲說道用到的東西,至於你本身想要實現的功能,就須要本身去查文檔了。
第二句,咱們使用了setShortcut函數。shortcut是這個動做的快捷鍵。Qt的QKeySequence已經爲咱們定義了不少內置的快捷鍵,好比咱們使用的Open。你能夠經過查閱API文檔得到全部的快捷鍵列表,或者是在QtCreator中輸入::後會有系統的自動補全功能顯示出來。這個與咱們本身定義的有什麼區別呢?簡單來講,咱們徹底能夠本身定義一個tr("Ctrl+O")來實現快捷鍵。緣由在於,這是Qt跨平臺性的體現。好比PC鍵盤和Mac鍵盤是不同的,一些鍵在PC鍵盤上有,而Max鍵盤上可能並不存在,或者反之,因此,推薦使用QKeySequence類來添加快捷鍵,這樣,它會根據平臺的不一樣來定義不一樣的快捷鍵。
第三句是setStatusTip函數。這是添加狀態欄的提示語句。狀態欄就是主窗口最下面的一條。如今咱們的程序尚未添加狀態欄,所以你是看不到有什麼做用的。
下面要作的是把這個QAction添加到菜單和工具條:

QMenu *file = menuBar()->addMenu(tr(
"&File"));

file->addAction(openAction);

QToolBar *toolBar = addToolBar(tr(
"&File"));

toolBar->addAction(openAction);
QMainWindow有一個menuBar()函數,會返回菜單欄,也就是最上面的那一條。若是不存在會自動建立,若是已經存在就返回那個菜單欄的指針。直接使用返回值添加一個菜單,也就是addMenu,參數是一個QString,也就是顯示的菜單名字。而後使用這個QMenu指針添加這個QAction。相似的,使用addToolBar函數的返回值添加了一個工具條,而且把這個QAction添加到了上面。
好了,主要的代碼已經寫完了。不過,若是你只修改這些的話,是編譯不過的哦!由於像menuBar()函數返回一個QMenuBar指針,可是你並無include它的頭文件哦!雖然沒有明着寫出QMenuBar這個類,可是實際上你已經用到了它的addMenu函數了,因此仍是要注意的!
下面給出來所有的代碼:
1. mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QtGui/QMainWindow>
class QAction;
class MainWindow :
public QMainWindow

{

Q_OBJECT
public:

MainWindow(QWidget *parent = 0);

~MainWindow();
private:

QAction *openAction;

};

#endif
// MAINWINDOW_H
2. mainwindow.cpp

#include <QtGui/QAction>

#include <QtGui/QMenu>

#include <QtGui/QMenuBar>

#include <QtGui/QKeySequence>

#include <QtGui/QToolBar>

#include
"mainwindow.h"

MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent)

{

openAction =
new QAction(tr(
"&Open"),
this);

openAction->setShortcut(QKeySequence::Open);

openAction->setStatusTip(tr(
"Open a file."));

QMenu *file = menuBar()->addMenu(tr(
"&File"));

file->addAction(openAction);

QToolBar *toolBar = addToolBar(tr(
"&File"));

toolBar->addAction(openAction);

}

MainWindow::~MainWindow()

{

}
main.cpp沒有修改,這裏就不給出了。下面是運行結果:
很醜,是吧?不過咱們已經添加上了菜單和工具條了哦!按一下鍵盤上的Alt+F,由於這是咱們給它定義的快捷鍵。雖然目前挺難看,不過之後就會變得漂亮的!想一想看,Linux的KDE桌面但是Qt實現的呢!