本節,咱們將在前面主窗口基礎之上,添加菜單和工具欄等的動做。雖然 Qt Creator 已經幫咱們實現了主窗口的框架代碼,可是具體的功能,仍是須要咱們一行行添加。框架
Qt 使用QAction
類做爲動做。顧名思義,這個類就是表明了窗口的一個「動做」,這個動做可能顯示在菜單,做爲一個菜單項,當用戶點擊該菜單項,對用戶的點擊作出響應;也可能在工具欄,做爲一個工具欄按鈕,用戶點擊這個按鈕就能夠執行相應的操做。有一點值得注意:不管是出如今菜單欄仍是工具欄,用戶選擇以後,所執行的動做應該都是同樣的。所以,Qt 並無專門的菜單項類,只是使用一個QAction
類,抽象出公共的動做。當咱們把QAction
對象添加到菜單,就顯示成一個菜單項,添加到工具欄,就顯示成一個工具按鈕。用戶能夠經過點擊菜單項、點擊工具欄按鈕、點擊快捷鍵來激活這個動做。函數
QAction
包含了圖標、菜單文字、快捷鍵、狀態欄文字、浮動幫助等信息。當把一個QAction
對象添加到程序中時,Qt 本身選擇使用哪一個屬性來顯示,無需咱們關心。同時,Qt 可以保證把QAction
對象添加到不一樣的菜單、工具欄時,顯示內容是同步的。也就是說,若是咱們在菜單中修改了QAction
的圖標,那麼在工具欄上面這個QAction
所對應的按鈕的圖標也會同步修改。工具
下面咱們來看看如何在QMainWindow
中使用QAction
:this
// !!! Qt 5 // ========== mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: void open(); QAction *openAction; }; #endif // MAINWINDOW_H // ========== mainwindow.cpp #include <QAction> #include <QMenuBar> #include <QMessageBox> #include <QStatusBar> #include <QToolBar> #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle(tr("Main Window")); openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this); openAction->setShortcuts(QKeySequence::Open); openAction->setStatusTip(tr("Open an existing file")); connect(openAction, &QAction::triggered, this, &MainWindow::open); QMenu *file = menuBar()->addMenu(tr("&File")); file->addAction(openAction); QToolBar *toolBar = addToolBar(tr("&File")); toolBar->addAction(openAction); statusBar() ; } MainWindow::~MainWindow() { } void MainWindow::open() { QMessageBox::information(this, tr("Information"), tr("Open")); } //main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
點擊運行,能夠看到MainWindow
的運行結果:指針
這是一個相對完整的程序。首先,咱們在MainWindow
類中添加了一個私有函數open()
和一個私有變量openAction
。在 MainWindow 的構造函數中,第一行咱們調用了setWindowTitle()
,設置主窗口的標題。注意咱們的文本使用tr()
函數,這是一個用於 Qt 國際化的函數。在後續章節中咱們能夠看到,咱們可使用 Qt 提供的國際化工具,將tr()
函數的字符串提取出來,進行國際化。因爲所需進行國際化的文本應該被大多數人認識,因此,tr()
函數裏面通常會是英文文本。code
而後,咱們在堆上建立了openAction
對象。在QAction
構造函數,咱們傳入了一個圖標、一個文本和 this 指針。咱們將在後面的文章中解釋 this 指針的含義。orm
圖標咱們使用了QIcon
,傳入值是一個字符串,是圖標的名稱,表示在當前路徑下的圖標。對象
QAction
第二個參數中,文本值前面有一個 &,意味着這將成爲一個快捷鍵。注意看截圖中 File 的 F 有一個下劃線。ip
下面一句,咱們使用了setShortcut()
函數,用於說明這個QAction
的快捷鍵。Qt 的QKeySequence
爲咱們定義了不少內置的快捷鍵,好比咱們使用的 Open。你能夠經過查閱 API 文檔得到全部的快捷鍵列表。 這個與咱們本身定義的有什麼區別呢?簡單來講,咱們徹底能夠本身定義一個tr("Ctrl+O")
來實現快捷鍵。緣由在於,這是 Qt 跨平臺性的體現。好比 PC 鍵盤和 Mac 鍵盤是不同的,一些鍵在 PC 鍵盤上有,而 Mac 鍵盤上可能並不存在,或者反之。使用QKeySequence
類來添加快捷鍵,會根據平臺的不一樣來定義相應的快捷鍵。文檔
setStatusTip()
則實現了當用戶鼠標滑過這個 action 時,會在主窗口下方的狀態欄顯示相應的提示。
後面的connect()
函數,將這個QAction
的triggered()
信號與MainWindow
類的open()
函數鏈接起來。當用戶點擊了這個QAction
時,會自動觸發MainWindow
的open()
函數。這是咱們以前已經瞭解過的。
下面的menuBar()
、toolBar()
和statusBar()
三個是QMainWindow
的函數,用於建立並返回菜單欄、工具欄和狀態欄。咱們能夠從代碼清楚地看出,咱們向菜單欄添加了一個 File 菜單,而且把這個QAction
對象添加到這個菜單;同時新增長了一個 File 工具欄,也把QAction
對象添加到了這個工具欄。咱們能夠看到,在菜單中,這個對象被顯示成一個菜單項,在工具欄變成了一個按鈕。至於狀態欄,則是出如今窗口最下方,用於顯示動做對象的提示信息的。