Qt 實現多級菜單

前言

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


Qt實現(多級)菜單

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

源碼分析

void Widget::createMenu()
{
    m_menu1 = new QMenu();
    m_menu1->addAction("1_1",this,SLOT(actionsSlot()));
    m_menu1->addAction("1_2",this,SLOT(actionsSlot()));
    m_menu1->addAction("1_3",this,SLOT(actionsSlot()));

    QMenu* menu2 = m_menu1->addMenu("2_0");
    menu2->addAction("2_1",this,SLOT(actionsSlot()));

    QMenu* menu3 = menu2->addMenu("3_0");
    menu2->addSeparator();
    menu3->addAction("3_1",this,SLOT(actionsSlot()));
    menu3->addAction("3_2",this,SLOT(actionsSlot()));
    menu3->addAction("3_3",this,SLOT(actionsSlot()));

    menu2->addAction("2_2",this,SLOT(actionsSlot()));
    menu2->addAction("2_3",this,SLOT(actionsSlot()));

    m_menu1->addSeparator();

    m_menu1->addAction("1_4",this,SLOT(actionsSlot()));
}
createMenu()函數中創建了三個菜單,通過addAction()函數添加小項目到每個菜單中,addAction()同時提供關聯到對象槽函數的重載版本,這樣就可以在添加的同時也關聯好槽函數,addMenu()給菜單添加下級菜單,當鼠標滑到addMenu()添加的項目是會自動彈出下級菜單。addSeparator()在每個QAction之間添加分離器。通過addAction()和addMenu()的結合使用就可以構造看起來很強大的多級菜單,再通過實現它們的槽函數我們就可以實現每個QAction被點擊時要響應的事件。


void Widget::actionsSlot()
{
    QAction *action = (QAction*)sender();
    QString actionText = action->text();

    qDebug()<<actionText<<"triggerred!"<<endl;

    if("1_1" == actionText) {
        //...
    } else if("1_2" == actionText) {
        //...
    }
        //...
}
該槽函數處理QAction點擊的時候要處理的事情。通過sender()取得發送信號的對象,再取得QAction的屬性就可以在代碼邏輯中分別處理不同的QAction該處理的事情。

void Widget::contextMenuEvent(QContextMenuEvent *event)
{
    m_menu1->exec(QCursor::pos());
    event->accept();
}
重寫contextMenuEvent()事件用於處理鼠標右鍵事件,但右擊鼠標時,在鼠標點擊的位置彈出菜單。

運行截圖






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章