目录
实现一个右键菜单,使用QMenu进行实现,效果图如下:
最近又发现了另一种实现右键菜单的方法,使用QWidget的上下文菜单策略实现,也可以去看一下这种方法,代码更简单哟!
本例子实现的具体功能:在一个空的widget中,鼠标右键点击,即可弹出一个菜单栏。
1.new 一个QMenu的对象;
2.给QMenu对象添加Action;
3.将QMenu对象显示在正确的位置上。
1.新建一个名为TestPro_QMenu的空白项目,继承自QWidget:
2.在TestPro_QMenu.h文件中加入头文件:
- #include "qmenu.h"
- #include "qevent.h"
3.在TestPro_QMenu.h文件中添加QMenu*的对象和QAction*的对象;
重写QWidget的mousePressEvent(QMouseEvent* event);函数,具体代码如下:
TestPro_QMenu.h文件
- #pragma once
-
- #include
- #include "ui_TestPro_QMenu.h"
- #include "qmenu.h"
- #include "qevent.h"
-
-
- class CTestPro_QMenu : public QWidget
- {
- Q_OBJECT
-
- public:
- CTestPro_QMenu(QWidget *parent = nullptr);
- ~CTestPro_QMenu();
-
- virtual void mousePressEvent(QMouseEvent* event);
- private:
- void CreateMenu();
- private slots:
- void SlotMenuClicked(QAction*);
-
- private:
- Ui::CTestPro_QMenuClass ui;
- //右键菜单
- QMenu* m_pMenuRD;
- QAction* m_pActionAdd;
- QAction* m_pActionDelete;
- QAction* m_pActionEdit;
-
- //测试菜单
- QMenu* m_pMenuTest;
- QAction* m_pActionTest1;
- QAction* m_pActionTest2;
- };
TestPro_QMenu.cpp:
- #include "TestPro_QMenu.h"
-
- CTestPro_QMenu::CTestPro_QMenu(QWidget *parent)
- : QWidget(parent)
- {
- ui.setupUi(this);
- CreateMenu();
- }
-
- CTestPro_QMenu::~CTestPro_QMenu()
- {
-
- }
-
- void CTestPro_QMenu::mousePressEvent(QMouseEvent* event)
- {
- if (event->button() == Qt::RightButton)
- {
- m_pMenuRD->exec(QCursor::pos());
- }
- }
-
- void CTestPro_QMenu::CreateMenu()
- {
- m_pMenuRD = new QMenu(this);
- m_pActionAdd = m_pMenuRD->addAction(tr("Add"));
- m_pActionDelete = m_pMenuRD->addAction(tr("Delete"));
- m_pActionEdit = m_pMenuRD->addAction(tr("Edit"));
- m_pMenuRD->addSeparator();
-
- m_pMenuTest = new QMenu(this);
- m_pMenuTest->setTitle(tr("Test"));
- m_pActionTest1 = m_pMenuTest->addAction(tr("Test1"));
- m_pActionTest2 = m_pMenuTest->addAction(tr("Test2"));
- m_pMenuRD->addMenu(m_pMenuTest);
-
- connect(m_pMenuRD, SIGNAL(triggered(QAction*)), this, SLOT(SlotMenuClicked(QAction*)));
- }
-
- void CTestPro_QMenu::SlotMenuClicked(QAction* action)
- {
- if (action == m_pActionAdd)
- {
- ui.m_pLabel->setText(tr("Add"));
- }
- else if (action == m_pActionDelete)
- {
- ui.m_pLabel->setText(tr("Delete"));
- }
- else if (action == m_pActionTest1)
- {
- ui.m_pLabel->setText(tr("Test1"));
- }
- }
项目运行时,会执行CreateMenu()函数,其中m_pMenuRD->addAction(tr("Add"));可以给菜单栏添加一个菜单项,并返回给m_pActionAdd; m_pMenuRD->addSeparator()增加了一条分隔符;
m_pMenuTest也是一个菜单,它又增加了2个子菜单项Test1,Test2,最后m_pMenuRD菜单使用addMenu()函数,将m_pMenuTest作为子项加入自己。
- void CTestPro_QMenu::mousePressEvent(QMouseEvent* event)
- {
- if (event->button() == Qt::RightButton)
- {
- m_pMenuRD->exec(QCursor::pos());
- }
- }
这是重写了鼠标点击事件,鼠标右键点击,就会进入if语句中去,m_pMenuRD->exec(QCursor::pos());该语句是将m_pMenuRD菜单显示到鼠标所在的位置。其中,QCursor::pos()返回当前鼠标所在的位置。
connect(m_pMenuRD, SIGNAL(triggered(QAction*)), this, SLOT(SlotMenuClicked(QAction*)));
当你点击菜单栏的某一项时,会触发triggered(QAction*)信号,其中参数就是QAction*对象,在槽函数中判断该QAction*对象是哪一个,做相对应的处理!
QMenu菜单栏的创建,添加子项,显示到相应的位置,以及点击之后出发的信号,本例子中都已经实现并对相应的代码做出了解释,主要用作记录。后续可能会有菜单栏样式相关的内容,再做补充。