Qt 菜單和工具條(續(xù))

2018-10-05 14:46 更新

菜單和工具條(續(xù))

前面一節(jié)我們已經(jīng)把 QAction 添加到菜單和工具條上面。現(xiàn)在我們要添加一些圖片美化一下,然后把信號(hào)槽加上,這樣,我們的 action 就可以相應(yīng)啦!

首先來(lái)添加圖標(biāo)。QAction 的圖標(biāo)會(huì)顯示在菜單項(xiàng)的前面以及工具條按鈕上面顯示。

為了添加圖標(biāo),我們首先要使用 Qt 的資源文件。在 QtCreator 的項(xiàng)目上右擊,選擇 New File...,然后選擇 resource file。

然后點(diǎn)擊 next,選擇好位置,F(xiàn)inish 即可。為了使用方便,我就把這個(gè)文件建在根目錄下,建議應(yīng)該在仔細(xì)規(guī)劃好文件之后,建在專門的 rsources 文件夾下。完成之后,生成的是一個(gè).qrc 文件,qrc 其實(shí)是 Qt Recource Collection 的縮寫。它只是一個(gè)普通的 XML 文件,可以用記事本等打開。不過,這里我們不去深究它的結(jié)構(gòu),完全利用 QtCreator 操作這個(gè)文件,

點(diǎn)擊 Add 按鈕,首先選擇 Add prefix,然后把生成的/new/prefix 改成/。這是 prefix 就是以后使用圖標(biāo)時(shí)需要提供的前綴,以/開頭。添加過 prefix 之后,然后在工程文件中添加一個(gè)圖標(biāo),再選擇Add file,選擇那個(gè)圖標(biāo)。這樣完成之后保存 qrc 文件即可。

說(shuō)明一下,QToolBar 的圖標(biāo)大小默認(rèn)是3232,菜單默認(rèn)是1616。如果提供的圖標(biāo)小于要求的尺寸,則不做操作,Qt 不會(huì)為你放大圖片;反之,如果提供的圖標(biāo)文件大于相應(yīng)的尺寸要求,比如是64*64,Qt 會(huì)自動(dòng)縮小尺寸。

圖片的路徑怎么看呢?可以看出,Qt 的資源文件視圖使用樹狀結(jié)構(gòu),根是/,葉子節(jié)點(diǎn)就是圖片位置,連接在一起就是路徑。比如這張圖片的路徑就是/Open.png。

注意,為了簡(jiǎn)單起見,我們沒有把圖標(biāo)放在專門的文件夾中。正式的項(xiàng)目中應(yīng)該單獨(dú)有一個(gè) resources文件夾放資源文件的。

然后回到前面的 mainwindow.cpp,在構(gòu)造函數(shù)中修改代碼:

openAction = new QAction(tr("&Open"), this); 
openAction->setShortcut(QKeySequence::Open); 
openAction->setStatusTip(tr("Open a file.")); 
openAction->setIcon(QIcon(":/Open.png")); // Add code.

我們使用 setIcon 添加圖標(biāo)。添加的類是 QIcon,構(gòu)造函數(shù)需要一個(gè)參數(shù),是一個(gè)字符串。由于我們要使用 qrc 中定義的圖片,所以字符串以 : 開始,后面跟著 prefix,因?yàn)槲覀兿惹岸x的 prefix是/,所以就需要一個(gè)/,然后后面是 file 的路徑。這是在前面的 qrc 中定義的,打開 qrc 看看那張圖片的路徑即可。

好了,圖片添加完成,然后點(diǎn)擊運(yùn)行,看看效果吧!

瞧!我們只需要修改 QAction,菜單和工具條就已經(jīng)為我們做好了相應(yīng)的處理,還是很方便的!

下一步,為 QAction 添加事件響應(yīng)。還記得 Qt 的事件響應(yīng)機(jī)制是基于信號(hào)槽嗎?點(diǎn)擊 QAction 會(huì)發(fā)出 triggered()信號(hào),所以,我們要做的是聲名一個(gè) slot,然后 connect 這個(gè)信號(hào)。

mainwindow.h

class MainWindow : public QMainWindow 
{ 
        Q_OBJECT 

public: 
        MainWindow(QWidget *parent = 0); 
        ~MainWindow(); 

private slots: 
        void open();         

private: 
        QAction *openAction; 
};

因?yàn)槲覀兊?open()目前只要在類的內(nèi)部使用,因此定義成 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")); 
}

注意,我們?cè)?open()函數(shù)中簡(jiǎn)單的彈出一個(gè)標(biāo)準(zhǔn)對(duì)話框,并沒有其他的操作。編譯后運(yùn)行,看看效果:

好了,關(guān)于 QAction 的動(dòng)作也已經(jīng)添加完畢了!

至此,QAction 有關(guān)的問題先告一段落。最后說(shuō)一下,如果你還不知道怎么添加子菜單的話,看一下QMenu 的 API,里面會(huì)有一個(gè) addMenu 函數(shù)。也就是說(shuō),創(chuàng)建一個(gè) QMenu 然后添加就可以的啦!

本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)