Essential Qt 第六章 記事本(三)添加圖片,工具欄,狀態欄與快捷鍵。

         在有圖像界面的程序中,添加一些圖片是很常見的事,這些圖片可以作爲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文件中添加一個私有函數
void CreateStatusBar();

            然後在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中添加一個私有函數用於快捷鍵的創建
void SetHotKey()
             然後在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();
}



發佈了92 篇原創文章 · 獲贊 19 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章