0


QT添加右键菜单(一):使用QMenu进行实现。

前言

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

标签: c++ 开发语言 qt

本文转载自: https://blog.csdn.net/qq_40876689/article/details/126443721
版权归原作者 三颗橘子 所有, 如有侵权,请联系我们删除。

“QT添加右键菜单(一):使用QMenu进行实现。”的评论:

还没有评论