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()事件用于处理鼠标右键事件,但右击鼠标时,在鼠标点击的位置弹出菜单。

运行截图




源码下载地址: Qt多级菜单(右键菜单)


  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 在Qt中,可以使用QMenu类和QAction类来实现按钮添加多级菜单的功能。 首先,我们创建一个QPushButton对象作为按钮。然后,创建QMenu对象作为按钮的菜单。使用addAction()方法来向菜单中添加一级菜单项。 接下来,我们创建QAction对象来添加多级菜单项。使用setMenu()方法将QMenu对象设置为QPushButton对象的下拉菜单。最后,通过show()方法来显示菜单。 下面是一个示例代码: ``` #include <QApplication> #include <QPushButton> #include <QMenu> #include <QAction> int main(int argc, char *argv[]) { QApplication a(argc, argv); QPushButton button("按钮"); QMenu menu(&button); // 添加一级菜单项 QAction *action1 = menu.addAction("一级菜单项"); // 创建二级菜单 QMenu *submenu = new QMenu("二级菜单项", &menu); // 添加二级菜单项 QAction *action2 = submenu->addAction("菜单项1"); QAction *action3 = submenu->addAction("菜单项2"); // 将二级菜单设置为一级菜单项的下拉菜单 action1->setMenu(submenu); // 显示按钮 button.show(); return a.exec(); } ``` 在以上代码中,我们首先创建了一个QPushButton对象,然后创建了一个QMenu对象。通过调用addAction()方法来向菜单中添加一级菜单项。 然后,我们创建了一个QMenu对象作为二级菜单,并使用addAction()方法向二级菜单中添加菜单项。接着,通过调用setMenu()方法将二级菜单设置为一级菜单项的下拉菜单。 最后,我们显示了按钮,并通过调用exec()方法来进入应用程序的事件循环中。 通过以上步骤,我们就可以实现Qt中给按钮添加多级菜单的功能。 ### 回答2: 在Qt中,我们可以使用QMenu类来实现按钮添加多级菜单。 首先,我们需要创建一个QMenu对象,并使用addAction()方法添加菜单项。如果需要添加菜单,我们可以使用addMenu()方法将另一个QMenu对象作为参数传递给它。 接下来,我们需要将QMenu对象与按钮相关联。可以使用setMenu()方法将QMenu对象设置为按钮的菜单。 最后,我们将按钮与菜单相关联。可以使用setPopupMode()方法将弹出模式设置为QToolButton::InstantPopup,这将使按钮以弹出菜单的形式显示。 以下是一个示例代码: ```cpp QPushButton *button = new QPushButton("按钮", this); QMenu *menu1 = new QMenu(button); QAction *action1 = menu1->addAction("菜单项1"); QAction *action2 = menu1->addAction("菜单项2"); QMenu *menu2 = new QMenu(menu1); QAction *subAction1 = menu2->addAction("菜单项1"); QAction *subAction2 = menu2->addAction("菜单项2"); menu1->addMenu(menu2); button->setMenu(menu1); button->setPopupMode(QToolButton::InstantPopup); ``` 这样,我们就实现了一个按钮添加了多级菜单的功能。当点击按钮时,将弹出菜单显示菜单项和菜单项。 希望以上解答能对您有所帮助! ### 回答3: 在Qt中,可以通过使用QMenu和QAction类来实现按钮添加多级菜单。 首先,在按钮的Clicked信号的槽函数中创建一个QMenu对象,这个QMenu对象将作为按钮的下拉菜单。然后,再创建多个QAction对象,并将它们添加到QMenu对象中,每个QAction对象代表一个菜单项。 接下来,将创建好的QMenu对象设置为按钮的菜单,可以使用setMenu()函数来实现。然后,将创建好的QAction对象添加到菜单中,可以使用addAction()函数来实现。 如果需要创建多级菜单,则可以将一个QMenu对象设置为另一个QMenu对象的菜单,通过addMenu()函数来实现。 最后,将按钮的菜单模式设置为MenuButtonPopup,这样当用户点击按钮时,菜单才会弹出。可以使用setPopupMode()函数来实现。 举个例,假设有个按钮btn,要为它添加多级菜单。可以按照以下步骤进行: 1. 创建一个QMenu对象menu1,并为它添加多个QAction对象,代表第一级菜单项。 2. 创建一个QMenu对象menu2,并为它添加多个QAction对象,代表第二级菜单项。 3. 使用addMenu()函数将menu2添加到menu1中,实现多级菜单。 4. 使用setMenu()函数将menu1设置为按钮btn的菜单。 例如: QMenu *menu1 = new QMenu(); QAction *action1 = new QAction("菜单项1", this); QAction *action2 = new QAction("菜单项2", this); QMenu *menu2 = new QMenu(); QAction *action3 = new QAction("二级菜单项1", this); QAction *action4 = new QAction("二级菜单项2", this); menu2->addAction(action3); menu2->addAction(action4); menu1->addAction(action1); menu1->addAction(action2); menu1->addMenu(menu2); btn->setMenu(menu1); btn->setPopupMode(QToolButton::MenuButtonPopup); 这样,按钮btn就添加了一个多级菜单,点击按钮时,会弹出对应的菜单项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值