【Qt筆記】添加動做

本節,咱們將在前面主窗口基礎之上,添加菜單和工具欄等的動做。雖然 Qt Creator 已經幫咱們實現了主窗口的框架代碼,可是具體的功能,仍是須要咱們一行行添加。框架

Qt 使用QAction類做爲動做。顧名思義,這個類就是表明了窗口的一個「動做」,這個動做可能顯示在菜單,做爲一個菜單項,當用戶點擊該菜單項,對用戶的點擊作出響應;也可能在工具欄,做爲一個工具欄按鈕,用戶點擊這個按鈕就能夠執行相應的操做。有一點值得注意:不管是出如今菜單欄仍是工具欄,用戶選擇以後,所執行的動做應該都是同樣的。所以,Qt 並無專門的菜單項類,只是使用一個QAction類,抽象出公共的動做。當咱們把QAction對象添加到菜單,就顯示成一個菜單項,添加到工具欄,就顯示成一個工具按鈕。用戶能夠經過點擊菜單項、點擊工具欄按鈕、點擊快捷鍵來激活這個動做。函數

QAction包含了圖標、菜單文字、快捷鍵、狀態欄文字、浮動幫助等信息。當把一個QAction對象添加到程序中時,Qt 本身選擇使用哪一個屬性來顯示,無需咱們關心。同時,Qt 可以保證把QAction對象添加到不一樣的菜單、工具欄時,顯示內容是同步的。也就是說,若是咱們在菜單中修改了QAction的圖標,那麼在工具欄上面這個QAction所對應的按鈕的圖標也會同步修改。工具

下面咱們來看看如何在QMainWindow中使用QActionthis

// !!! 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()函數,將這個QActiontriggered()信號與MainWindow類的open()函數鏈接起來。當用戶點擊了這個QAction時,會自動觸發MainWindowopen()函數。這是咱們以前已經瞭解過的。

下面的menuBar()toolBar()statusBar()三個是QMainWindow的函數,用於建立並返回菜單欄、工具欄和狀態欄。咱們能夠從代碼清楚地看出,咱們向菜單欄添加了一個 File 菜單,而且把這個QAction對象添加到這個菜單;同時新增長了一個 File 工具欄,也把QAction對象添加到了這個工具欄。咱們能夠看到,在菜單中,這個對象被顯示成一個菜單項,在工具欄變成了一個按鈕。至於狀態欄,則是出如今窗口最下方,用於顯示動做對象的提示信息的。

相關文章
相關標籤/搜索