原文地址::https://blog.csdn.net/heaven_evil/article/details/78601478
前言
在众多知名的软件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()));
- }
- void Widget::actionsSlot()
- {
- QAction *action = (QAction*)sender();
- QString actionText = action->text();
- qDebug()<<actionText<<"triggerred!"<<endl;
- if("1_1" == actionText) {
- //...
- } else if("1_2" == actionText) {
- //...
- }
- //...
- }
- void Widget::contextMenuEvent(QContextMenuEvent *event)
- {
- m_menu1->exec(QCursor::pos());
- event->accept();
- }
运行截图
源码下载地址:
Qt多级菜单(右键菜单)