前面一節我們已經把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然後添加就可以的啦!
本文出自 “豆子空間” 博客,請務必保留此出處http://devbean.blog.51cto.com/448512/205958