1. 程式人生 > >Qt 實現多級選單

Qt 實現多級選單

前言

在眾多知名的軟體UI中下拉選單、按鈕選單、右鍵選單、托盤選單、多級選單等等是很常見的,就連Windows和linux等系統級的軟體也用到這些UI元素。下圖就是我們最常見的Windows系統多級選單:

Qt實現(多級)選單

在Qt中通過QMenu和QAction就可以實現這些選單,QMenu就是上圖中我們看到的三個級聯選單,每個QMenu裡面的小專案就是一個QAction,一個QAction由一個圖示和一段文字描述組成。要先右鍵彈出選單我們需要重寫contextMenuEvent(QContextMenuEvent *event)事件,如果是按鈕選單等關聯訊號槽,在槽函式彈出選單即可。

原始碼分析

  1. void Widget::createMenu()  
  2. {  
  3.     m_menu1 = new QMenu();  
  4.     m_menu1->addAction("1_1",this,SLOT(actionsSlot()));  
  5.     m_menu1->addAction("1_2",this,SLOT(actionsSlot()));  
  6.     m_menu1->addAction("1_3",this,SLOT(actionsSlot()));  
  7.     QMenu* menu2 = m_menu1->addMenu("2_0");  
  8.     menu2->addAction("2_1"
    ,this,SLOT(actionsSlot()));  
  9.     QMenu* menu3 = menu2->addMenu("3_0");  
  10.     menu2->addSeparator();  
  11.     menu3->addAction("3_1",this,SLOT(actionsSlot()));  
  12.     menu3->addAction("3_2",this,SLOT(actionsSlot()));  
  13.     menu3->addAction("3_3",this,SLOT(actionsSlot()));  
  14.     menu2->addAction("2_2"
    ,this,SLOT(actionsSlot()));  
  15.     menu2->addAction("2_3",this,SLOT(actionsSlot()));  
  16.     m_menu1->addSeparator();  
  17.     m_menu1->addAction("1_4",this,SLOT(actionsSlot()));  
  18. }  
createMenu()函式中建立了三個選單,通過addAction()函式新增小專案到每個選單中,addAction()同時提供關聯到物件槽函式的過載版本,這樣就可以在新增的同時也關聯好槽函式,addMenu()給選單新增下級選單,當滑鼠滑到addMenu()新增的專案是會自動彈出下級選單。addSeparator()在每個QAction之間新增分離器。通過addAction()和addMenu()的結合使用就可以構造看起來很強大的多級選單,再通過實現它們的槽函式我們就可以實現每個QAction被點選時要響應的事件。
  1. void Widget::actionsSlot()  
  2. {  
  3.     QAction *action = (QAction*)sender();  
  4.     QString actionText = action->text();  
  5.     qDebug()<<actionText<<"triggerred!"<<endl;  
  6.     if("1_1" == actionText) {  
  7.         //...
  8.     } elseif("1_2" == actionText) {  
  9.         //...
  10.     }  
  11.         //...
  12. }  
該槽函式處理QAction點選的時候要處理的事情。通過sender()取得傳送訊號的物件,再取得QAction的屬性就可以在程式碼邏輯中分別處理不同的QAction該處理的事情。
  1. void Widget::contextMenuEvent(QContextMenuEvent *event)  
  2. {  
  3.     m_menu1->exec(QCursor::pos());  
  4.     event->accept();  
  5. }  
重寫contextMenuEvent()事件用於處理滑鼠右鍵事件,但右擊滑鼠時,在滑鼠點選的位置彈出選單。

執行截圖