原文地址: https://blog.csdn.net/xqhrs232/article/details/80351828
前言
在眾多知名的軟件UI中下拉菜單塌鸯、按鈕菜單悼瓮、右鍵菜單、托盤菜單熙兔、多級菜單等等是很常見的囱稽,就連Windows和linux等系統(tǒng)級的軟件也用到這些UI元素。
下圖就是我們最常見的Windows系統(tǒng)多級菜單:
Qt實現(xiàn)(多級)菜單
在Qt中通過QMenu和QAction就可以實現(xiàn)這些菜單秕铛,QMenu就是上圖中我們看到的三個級聯(lián)菜單约郁,每個QMenu里面的小項目就是一個QAction,一個QAction由一個圖標(biāo)和一段文字描述組成但两。要先右鍵彈出菜單我們需要重寫contextMenuEvent(QContextMenuEvent *event)事件鬓梅,如果是按鈕菜單等關(guān)聯(lián)信號槽,在槽函數(shù)彈出菜單即可谨湘。
源碼分析
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()函數(shù)中創(chuàng)建了三個菜單绽快,通過addAction()函數(shù)添加小項目到每個菜單中,addAction()同時提供關(guān)聯(lián)到對象槽函數(shù)的重載版本,這樣就可以在添加的同時也關(guān)聯(lián)好槽函數(shù)悲关,addMenu()給菜單添加下級菜單谎僻,當(dāng)鼠標(biāo)滑到addMenu()添加的項目是會自動彈出下級菜單。addSeparator()在每個QAction之間添加分離器寓辱。通過addAction()和addMenu()的結(jié)合使用就可以構(gòu)造看起來很強(qiáng)大的多級菜單艘绍,再通過實現(xiàn)它們的槽函數(shù)我們就可以實現(xiàn)每個QAction被點擊時要響應(yīng)的事件。
void Widget::actionsSlot()
{
QAction *action = (QAction*)sender();
QString actionText = action->text();
qDebug()<<actionText<<"triggerred!"<<endl;
if("1_1" == actionText) {
//...
} else if("1_2" == actionText) {
//...
}
//...
}
該槽函數(shù)處理QAction點擊的時候要處理的事情秫筏。通過sender()取得發(fā)送信號的對象诱鞠,再取得QAction的屬性就可以在代碼邏輯中分別處理不同的QAction該處理的事情。
void Widget::contextMenuEvent(QContextMenuEvent *event)
{
m_menu1->exec(QCursor::pos());
event->accept();
}
重寫contextMenuEvent()事件用于處理鼠標(biāo)右鍵事件这敬,但右擊鼠標(biāo)時航夺,在鼠標(biāo)點擊的位置彈出菜單。