前面一節我們已經把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