• QMenu的基本使用:实现右键弹出菜单栏


    目录

    前言

    1.先看效果图

    1.要实现弹出菜单栏,主要有三步:

    2.Demo具体实现过程如下:

    3.总结:


    前言

    实现一个右键菜单,使用QMenu进行实现,效果图如下:

    最近又发现了另一种实现右键菜单的方法,使用QWidget的上下文菜单策略实现,也可以去看一下这种方法,代码更简单哟!

    1.先看效果图

     本例子实现的具体功能:在一个空的widget中,鼠标右键点击,即可弹出一个菜单栏。

    1.要实现弹出菜单栏,主要有三步:

    1.new 一个QMenu的对象;

    2.给QMenu对象添加Action;

    3.将QMenu对象显示在正确的位置上。

    2.Demo具体实现过程如下:

    1.新建一个名为TestPro_QMenu的空白项目,继承自QWidget:

    2.在TestPro_QMenu.h文件中加入头文件:

    1. #include "qmenu.h"
    2. #include "qevent.h"

    3.在TestPro_QMenu.h文件中添加QMenu*的对象和QAction*的对象;

    重写QWidget的mousePressEvent(QMouseEvent* event);函数,具体代码如下:

    TestPro_QMenu.h文件

    1. #pragma once
    2. #include
    3. #include "ui_TestPro_QMenu.h"
    4. #include "qmenu.h"
    5. #include "qevent.h"
    6. class CTestPro_QMenu : public QWidget
    7. {
    8. Q_OBJECT
    9. public:
    10. CTestPro_QMenu(QWidget *parent = nullptr);
    11. ~CTestPro_QMenu();
    12. virtual void mousePressEvent(QMouseEvent* event);
    13. private:
    14. void CreateMenu();
    15. private slots:
    16. void SlotMenuClicked(QAction*);
    17. private:
    18. Ui::CTestPro_QMenuClass ui;
    19. //右键菜单
    20. QMenu* m_pMenuRD;
    21. QAction* m_pActionAdd;
    22. QAction* m_pActionDelete;
    23. QAction* m_pActionEdit;
    24. //测试菜单
    25. QMenu* m_pMenuTest;
    26. QAction* m_pActionTest1;
    27. QAction* m_pActionTest2;
    28. };

    TestPro_QMenu.cpp:

    1. #include "TestPro_QMenu.h"
    2. CTestPro_QMenu::CTestPro_QMenu(QWidget *parent)
    3. : QWidget(parent)
    4. {
    5. ui.setupUi(this);
    6. CreateMenu();
    7. }
    8. CTestPro_QMenu::~CTestPro_QMenu()
    9. {
    10. }
    11. void CTestPro_QMenu::mousePressEvent(QMouseEvent* event)
    12. {
    13. if (event->button() == Qt::RightButton)
    14. {
    15. m_pMenuRD->exec(QCursor::pos());
    16. }
    17. }
    18. void CTestPro_QMenu::CreateMenu()
    19. {
    20. m_pMenuRD = new QMenu(this);
    21. m_pActionAdd = m_pMenuRD->addAction(tr("Add"));
    22. m_pActionDelete = m_pMenuRD->addAction(tr("Delete"));
    23. m_pActionEdit = m_pMenuRD->addAction(tr("Edit"));
    24. m_pMenuRD->addSeparator();
    25. m_pMenuTest = new QMenu(this);
    26. m_pMenuTest->setTitle(tr("Test"));
    27. m_pActionTest1 = m_pMenuTest->addAction(tr("Test1"));
    28. m_pActionTest2 = m_pMenuTest->addAction(tr("Test2"));
    29. m_pMenuRD->addMenu(m_pMenuTest);
    30. connect(m_pMenuRD, SIGNAL(triggered(QAction*)), this, SLOT(SlotMenuClicked(QAction*)));
    31. }
    32. void CTestPro_QMenu::SlotMenuClicked(QAction* action)
    33. {
    34. if (action == m_pActionAdd)
    35. {
    36. ui.m_pLabel->setText(tr("Add"));
    37. }
    38. else if (action == m_pActionDelete)
    39. {
    40. ui.m_pLabel->setText(tr("Delete"));
    41. }
    42. else if (action == m_pActionTest1)
    43. {
    44. ui.m_pLabel->setText(tr("Test1"));
    45. }
    46. }

    项目运行时,会执行CreateMenu()函数,其中m_pMenuRD->addAction(tr("Add"));可以给菜单栏添加一个菜单项,并返回给m_pActionAdd; m_pMenuRD->addSeparator()增加了一条分隔符;

     m_pMenuTest也是一个菜单,它又增加了2个子菜单项Test1,Test2,最后m_pMenuRD菜单使用addMenu()函数,将m_pMenuTest作为子项加入自己。

    1. void CTestPro_QMenu::mousePressEvent(QMouseEvent* event)
    2. {
    3. if (event->button() == Qt::RightButton)
    4. {
    5. m_pMenuRD->exec(QCursor::pos());
    6. }
    7. }

    这是重写了鼠标点击事件,鼠标右键点击,就会进入if语句中去,m_pMenuRD->exec(QCursor::pos());该语句是将m_pMenuRD菜单显示到鼠标所在的位置。其中,QCursor::pos()返回当前鼠标所在的位置。

    connect(m_pMenuRD, SIGNAL(triggered(QAction*)), this, SLOT(SlotMenuClicked(QAction*)));

    当你点击菜单栏的某一项时,会触发triggered(QAction*)信号,其中参数就是QAction*对象,在槽函数中判断该QAction*对象是哪一个,做相对应的处理!

    3.总结:

    QMenu菜单栏的创建,添加子项,显示到相应的位置,以及点击之后出发的信号,本例子中都已经实现并对相应的代码做出了解释,主要用作记录。后续可能会有菜单栏样式相关的内容,再做补充。

  • 相关阅读:
    如何安装cuda和cudnn
    Java--Spring和MyBatis集成
    【数据结构】树Tree
    Can Abnormality be Detected by Graph Neural Networks?
    C语言之ASC转hex
    CAN透传云网关给EPEC3724控制器升级方案
    List is a raw type. References to generic type List<E> should be parameterized
    P1266 速度限制 ( dij分层 + 图上dp
    GitHub的下载超时问题
    基于Java电动车上牌管理系统计实现(源码+lw+部署文档+讲解等)
  • 原文地址:https://blog.csdn.net/qq_40876689/article/details/126443721