1. 程式人生 > >Qt學習筆記(四)——新增動作、資原始檔

Qt學習筆記(四)——新增動作、資原始檔

一、新增動作

Qt 使用QAction類作為動作。顧名思義,這個類就是代表了視窗的一個“動作”,這個動作可能顯示在選單,作為一個選單項,當用戶點選該選單項,對使用者的點選做出響應;也可能在工具欄,作為一個工具欄按鈕,使用者點選這個按鈕就可以執行相應的操作。有一點值得注意:無論是出現在選單欄還是工具欄,使用者選擇之後,所執行的動作應該都是一樣的。因此,Qt 並沒有專門的選單項類,只是使用一個QAction類,抽象出公共的動作。當我們把QAction物件新增到選單,就顯示成一個選單項,新增到工具欄,就顯示成一個工具按鈕。使用者可以通過點選選單項、點選工具欄按鈕、點選快捷鍵來啟用這個動作。

QAction

包含了圖示、選單文字、快捷鍵、狀態列文字、浮動幫助等資訊。當把一個QAction物件新增到程式中時,Qt 自己選擇使用哪個屬性來顯示,無需我們關心。同時,Qt 能夠保證把QAction物件新增到不同的選單、工具欄時,顯示內容是同步的。也就是說,如果我們在選單中修改了QAction的圖示,那麼在工具欄上面這個QAction所對應的按鈕的圖示也會同步修改。

// ========== 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"));
}
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow win;
    win.show();

    return app.exec();
}

執行結果如下:

下面是對程式的解釋:

MainWindow類中添加了一個私有函式open()和一個私有變數openAction。在 MainWindow 的建構函式中,第一行呼叫了setWindowTitle(),設定主視窗的標題。注意文字使用tr()函式,這是一個用於 Qt 國際化的函式。tr()函式裡面一般會是英文文字。

在堆上建立了openAction物件。在QAction建構函式,傳入了一個圖示、一個文字和 this 指標。

圖示使用了QIcon,傳入值是一個字串,這個字串對應於 Qt 資原始檔中的一段路徑。Qt 資原始檔的字尾名是 qrc。如果使用 Qt Creator,我們可以在新建檔案中看到 Qt 資原始檔。Qt 資原始檔其實是一個 XML 描述的檔案,表示 Qt 應用程式所需要的各個資源。

QAction第二個引數中,文字值前面有一個 &,意味著這將成為一個快捷鍵。下面一句,使用了setShortcut()函式,用於說明這個QAction的快捷鍵。Qt 的QKeySequence為我們定義了很多內建的快捷鍵,比如我們使用的 Open。可以通過查閱 API 文件獲得所有的快捷鍵列表。使用QKeySequence類來新增快捷鍵,會根據平臺的不同來定義相應的快捷鍵。所以比自己定義快捷鍵要更為合適。

setStatusTip()則實現了當使用者滑鼠滑過這個 action 時,會在主視窗下方的狀態列顯示相應的提示。後面的connect()函式,將這個QActiontriggered()訊號與MainWindow類的open()函式連線起來。當用戶點選了這個QAction時,會自動觸發MainWindowopen()函式。

下面的menuBar()toolBar()statusBar()三個是QMainWindow的函式,用於建立並返回選單欄、工具欄和狀態列。我們可以從程式碼清楚地看出,我們向選單欄添加了一個 File 選單,並且把這個QAction物件新增到這個選單;同時新增加了一個 File 工具欄,也把QAction物件新增到了這個工具欄。我們可以看到,在選單中,這個物件被顯示成一個選單項,在工具欄變成了一個按鈕。至於狀態列,則是出現在視窗最下方,用於顯示動作物件的提示資訊的。

二、資原始檔

Qt 資源系統是一個跨平臺的資源機制,用於將程式執行時所需要的資源以二進位制的形式儲存於可執行檔案內部。如果你的程式需要載入特定的資源(圖示、文字翻譯等),那麼,將其放置在資原始檔中,就再也不需要擔心這些檔案的丟失。也就是說,如果你將資源以資原始檔形式儲存,它是會編譯到可執行檔案內部。

使用 Qt Creator 可以很方便地建立資原始檔。

然後選擇預設設定,建立完成。

可以看到我們建立的資原始檔。

右側的編輯區有個“新增”,我們首先需要新增字首,比如我們將字首取名為 images。然後選中這個字首,繼續點選新增檔案,可以找到我們所需新增的檔案。這裡,我們選擇 document-open.png 檔案。當我們完成操作之後,Qt Creator 應該是這樣子的:

接下來,我們還可以新增另外的字首或者另外的檔案。這取決於你的需要。當我們新增完成之後,通過使用 : 開頭的路徑來找到這個檔案。比如,我們的字首是 /images,檔案是 dog.jpg,那麼就可以使用:/images/dog.jpg找到這個檔案。

更好的辦法是,我們給這個檔案去一個“別名”,以後就以這個別名來引用這個檔案。具體做法是,選中這個檔案,新增別名資訊:

這樣,我們可以直接使用:/images/1引用到這個資源,無需關心圖片的真實檔名。

如果仔細觀察,還會看到資源編輯視窗最下方有一個“語言”。這個可以對資源進行國際化。這個“語言”的作用是,如果 Qt 發現,本機的本地化資訊是 fr (這裡假設設定了語言為fr)的話(QLocale::system().name()返回 fr_FR),則使用:/images/fr/1這個圖片;如果不是,則預設使用:/images/1這個。