QT添加右键菜单(一):使用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文件中加入头文件:

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

  • 10
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值