天天看點

Qt學習之路(13): 菜單和工具條(續)

前面一節我們已經把QAction添加到菜單和工具條上面。現在我們要添加一些圖檔美化一下,然後把信号槽加上,這樣,我們的action就可以相應啦!

首先來添加圖示。QAction的圖示會顯示在菜單項的前面以及工具條按鈕上面顯示。

為了添加圖示,我們首先要使用Qt的資源檔案。在QtCreator的項目上右擊,選擇New File...,然後選擇resource file。

然後點選next,選擇好位置,Finish即可。為了使用友善,我就把這個檔案建在根目錄下,建議應該在仔細規劃好檔案之後,建在專門的rsources檔案夾下。完成之後,生成的是一個.qrc檔案,qrc其實是Qt Recource Collection的縮寫。它隻是一個普通的XML檔案,可以用記事本等打開。不過,這裡我們不去深究它的結構,完全利用QtCreator操作這個檔案,

點選Add按鈕,首先選擇Add prefix,然後把生成的/new/prefix改成/。這是prefix就是以後使用圖示時需要提供的字首,以/開頭。添加過prefix之後,然後在工程檔案中添加一個圖示,再選擇Add file,選擇那個圖示。這樣完成之後儲存qrc檔案即可。

說明一下,QToolBar的圖示大小預設是32*32,菜單預設是16*16。如果提供的圖示小于要求的尺寸,則不做操作,Qt不會為你放大圖檔;反之,如果提供的圖示檔案大于相應的尺寸要求,比如是64*64,Qt會自動縮小尺寸。

圖檔的路徑怎麼看呢?可以看出,Qt的資源檔案視圖使用樹狀結構,根是/,葉子節點就是圖檔位置,連接配接在一起就是路徑。比如這張圖檔的路徑就是/Open.png。

注意,為了簡單起見,我們沒有把圖示放在專門的檔案夾中。正式的項目中應該單獨有一個resources檔案夾放資源檔案的。

然後回到前面的mainwindow.cpp,在構造函數中修改代碼:

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

openAction->setShortcut(QKeySequence::Open); 

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

openAction->setIcon(QIcon(":/Open.png")); // Add code.

我們使用setIcon添加圖示。添加的類是QIcon,構造函數需要一個參數,是一個字元串。由于我們要使用qrc中定義的圖檔,是以字元串以 : 開始,後面跟着prefix,因為我們先前定義的prefix是/,是以就需要一個/,然後後面是file的路徑。這是在前面的qrc中定義的,打開qrc看看那張圖檔的路徑即可。

好了,圖檔添加完成,然後點選運作,看看效果吧!

瞧!我們隻需要修改QAction,菜單和工具條就已經為我們做好了相應的處理,還是很友善的!

下一步,為QAction添加事件響應。還記得Qt的事件響應機制是基于信号槽嗎?點選QAction會發出triggered()信号,是以,我們要做的是聲名一個slot,然後connect這個信号。

mainwindow.h

class MainWindow : public QMainWindow 

        Q_OBJECT 

public: 

        MainWindow(QWidget *parent = 0); 

        ~MainWindow(); 

private slots: 

        void open();         

private: 

        QAction *openAction; 

};

因為我們的open()目前隻要在類的内部使用,是以定義成private slots即可。然後修改cpp檔案:

MainWindow::MainWindow(QWidget *parent) 

        : QMainWindow(parent) 

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

        openAction->setShortcut(QKeySequence::Open); 

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

        openAction->setIcon(QIcon(":/Open.png")); 

        connect(openAction, SIGNAL(triggered()), this, SLOT(open())); 

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

        file->addAction(openAction); 

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

        toolBar->addAction(openAction); 

void MainWindow::open() 

        QMessageBox::information(NULL, tr("Open"), tr("Open a file")); 

}

注意,我們在open()函數中簡單的彈出一個标準對話框,并沒有其他的操作。編譯後運作,看看效果:

好了,關于QAction的動作也已經添加完畢了!

至此,QAction有關的問題先告一段落。最後說一下,如果你還不知道怎麼添加子菜單的話,看一下QMenu的API,裡面會有一個addMenu函數。也就是說,建立一個QMenu然後添加就可以的啦!

本文轉自 FinderCheng 51CTO部落格,原文連結:

http://blog.51cto.com/devbean/205958

繼續閱讀