前言
实现一个右键菜单,使用QMenu进行实现,效果图如下:
最近又发现了另一种实现右键菜单的方法,使用QWidget的上下文菜单策略实现,也可以去看一下这种方法,代码更简单哟!
1.先看效果图
本例子实现的具体功能:在一个空的widget中,鼠标右键点击,即可弹出一个菜单栏。
1.要实现弹出菜单栏,主要有三步:
1.new 一个QMenu的对象;
2.给QMenu对象添加Action;
3.将QMenu对象显示在正确的位置上。
2.Demo具体实现过程如下:
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 <QtWidgets/QWidget>
#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对象是哪一个,做相对应的处理!
3.总结:
QMenu菜单栏的创建,添加子项,显示到相应的位置,以及点击之后出发的信号,本例子中都已经实现并对相应的代码做出了解释,主要用作记录。后续可能会有菜单栏样式相关的内容,再做补充。
版权归原作者 三颗橘子 所有, 如有侵权,请联系我们删除。