在有圖像界面的程序中,添加一些圖片是很常見的事,這些圖片可以作爲log,背景等,而在這裏演示的是將一些圖片添加到菜單中,並作爲工具欄的內容。
Qt中使用一種qrc格式的文件來作爲添加資源的文件,注意這裏是添加的資源不限於圖片,其他音頻視頻也可以這樣添加。具體步驟:
1.在程序目錄下新建一個images的子文件目錄,然後將需要的圖片放入這個子目錄呢
2.建立一個qrc格式文件,例子中是pix.qrc,具體內容爲XML格式
<RCC>
<qresource>
<file>images/center.png</file>
<file>images/copy.png</file>
<file>images/cut.png</file>
<file>images/delete.png</file>
<file>images/files.ico</file>
<file>images/left.png</file>
<file>images/new.png</file>
<file>images/open.png</file>
<file>images/paste.png</file>
<file>images/read.png</file>
<file>images/re.png</file>
<file>images/right.png</file>
<file>images/saveAs.png</file>
<file>images/save.png</file>
<file>images/un.png</file>
</qresource>
</RCC>
然後就可以在程序中使用這些圖片了
在前面的例子中菜單文件和編輯上的一些動作(QAction)可以添加一個圖片作爲標識,在ReadMe.h文件中添加一個私有函數SetActionPix()來實現這個功能,這個函數具體實現如下
void ReadMe::SetActionPix()
{
New_Action->setIcon(QIcon(":/images/new.png")); //註釋1
Open_Action->setIcon(QIcon(":/images/open.png"));
Save_Action->setIcon(QIcon(":/images/save.png"));
SaveAs_Action->setIcon(QIcon(":/images/saveAs.png"));
Redo_Action->setIcon(QIcon(":/images/re.png"));
Undo_Action->setIcon(QIcon(":/images/un.png"));
Cut_Action->setIcon(QIcon(":/images/cut.png"));
Copy_Action->setIcon(QIcon(":/images/copy.png"));
Paste_Action->setIcon(QIcon(":/images/paste.png"));
Delete_Action->setIcon(QIcon(":/images/delete.png"));
LeftAlignment_Action->setIcon(QIcon(":/images/left.png"));
RightAlignment_Action->setIcon(QIcon(":/images/right.png"));
MidAlignment_Action->setIcon(QIcon(":/images/center.png"));
}
註釋1: 這裏QIcon()函數用於返回一個指向QIcon類的指針,換個不太恰當的說法就是返回指向圖片的指針,而
QAction的成員函數setIcon()則用於給動作添加圖片
這樣就完成了給菜單上的動作添加圖片的工作,接下來的任務是給這個程序添加一個工具欄,在 QMainWindow中,成員函數addToolBar()用於添加一個工具欄,同時返回執行指向這個工具欄的指針,這個指針的類型是QToolBar*,在文件中添加包含這個類的頭文件,同時在添加一個用於創建工具欄的私有函數CreateToolBar()來具體實現。
ReadMe.h文件應該添加下面的代碼
#include<QToolBar>
//..
//.
QToolBar* FileTools_ToolBar;
QToolBar* EditTools_ToolBar;
QToolBar* FormatTools_ToolBar;
//..
CreateToolBar();
然後在ReadMe.cxx文件中實現這個函數的功能
void ReadMe::CreateToolBar()
{
FileTools_ToolBar = addToolBar(tr("文件")); //註釋1
FileTools_ToolBar->addAction(New_Action);
FileTools_ToolBar->addAction(Open_Action);
FileTools_ToolBar->addAction(Save_Action);
FileTools_ToolBar->addAction(SaveAs_Action);
EditTools_ToolBar = addToolBar(tr("編輯"));
EditTools_ToolBar->addAction(Redo_Action);
EditTools_ToolBar->addAction(Undo_Action);
EditTools_ToolBar->addAction(Cut_Action);
EditTools_ToolBar->addAction(Copy_Action);
EditTools_ToolBar->addAction(Paste_Action);
EditTools_ToolBar->addAction(Delete_Action);
FormatTools_ToolBar = addToolBar(tr("格式"));
FormatTools_ToolBar->addAction(LeftAlignment_Action);
FormatTools_ToolBar->addAction(MidAlignment_Action);
FormatTools_ToolBar->addAction(RightAlignment_Action);
}
註釋1: QMainWindow類的成員函數addToolBar()創建一個工具欄,同時返回指向這個工具欄的指針,然後就
可以向這個工具欄裏添加動作(QAction),創建工具欄和創建菜單欄很相似,又有些區別,可以仔細對比
下CreateMenu(),CreateMenuBar()和CreateToolBar()的區別
接下來是個程序添加一個狀態欄,一般狀態欄位於程序的底部,用於說明某些功能的詳細,QMainWindow類成員函數statusBar()會在第一次調用時創建一個狀態欄,我們這裏要做的是當鼠標懸停在菜單上的某個選項(即QAction)時,狀態欄會給出這個選項的詳細說明,而QAction類提供了一個成員函數setStatusTip()來實現這個功能,現在將這個功能整合到我們的程序ReadMe中
首先在ReadMe.h文件中添加一個私有函數
然後在ReadMe.cxx文件中實現這個函數
void ReadMe::CreateStatusBar()
{
statusBar(); //註釋1
New_Action->setStatusTip(tr("新建一個文件")); //註釋2
Open_Action->setStatusTip(tr("打開一個文件"));
Save_Action->setStatusTip(tr("保存當前文件"));
}
註釋1:這裏調用statusBar()來生產一個狀態欄,這個函數同時返回一個指向QStatusBar類型的指針,也就是這個函數生產的
的狀態欄的指針,在我們這個例子中,由於只需要在狀態欄上顯示信息,默認的狀態欄足以,所以對於返回的指針不
需要做什麼,但如果有需要額外的功能,可以將這個函數的返回值複製給一個QStatusBar*,然後在繼續操作
註釋2: 這裏使用了QAction的成員函數setStatusTip()來生成狀態欄上的信息,以“新建”爲例,當鼠標懸停在“文件”菜單上
的“新件”選項是,程序底部的狀態欄上就會顯示信息“新建一個文件”。這裏我只設置了3個選項的狀態信息,你也可
以根據程序的具體需求添加其他QAction選項的狀態信息
對於一個程序來說,快捷鍵是必不可少的一部分,很多時候使用鍵盤會比使用鼠標更加方便,Qt也提供了一套關於快捷鍵的方法,以我們現在製作的這個程序爲例,最簡單的方法就是調用QAction的成員函數setShortcut()來實現快捷鍵的功能,
但這裏遇到一個問題,不同的平臺快捷鍵搜索不同,例如windows系統的Ctrl+c是複製的快捷鍵,但在Linux系統下Ctrl+c表示終止程序運行,爲了解決不同平臺快捷鍵衝突的問題,Qt提供了一個類QKeySquence來解決次問題。
首先在ReadMe.h中添加一個私有函數用於快捷鍵的創建
然後在ReadMe.cxx文件中實現這個函數
void ReadMe::SetHotKey()
{
New_Action->setShortcut(QKeySequence::New); //註釋1
Copy_Action->setShortcut(QKeySequence::Copy);
Paste_Action->setShortcut(QKeySequence::Paste);
}
註釋1:以“打開”爲例,其實這樣裏可以寫成setShortcut("Ctrl+O")來實現功能,但就如前文所述,不同平臺的快捷鍵是不完
全一樣的(雖然Ctrl+O各平臺都有相同功能,但不是每個快捷鍵都這樣),所以用QKeySequence類實現比在代碼中
寫死要更加靈活,當代碼需要跨平臺是更加如此。QkeSequence提供了大量的快捷鍵,內容太多無法在這裏全部列
出,可以在assistant中查詢該類,看看裏面是否有你需要的快捷鍵
到這裏我們完成了記事本程序的大部分界面製作,下章開始我們將實現他的各項功能,這裏再次給出ReadMe程序到目前爲止的構造函數的完整代碼
ReadMe::ReadMe(QWidget* parent):QMainWindow(parent)
{
CreateAction();
CreateMenu();
CreateMenuBar();
SetActionPix();
CreateToolBar();
CreateStatusBar();
SetHotKey();
MainEditWindow = new QTextEdit;
setCentralWidget(MainEditWindow);
FindWordsDialog = new FindDialog(this);
setWindowTitle(tr("記事本"));
ConnectSignalAndSlot();
}