QT实现右键菜单栏

发布于:2025-06-12 ⋅ 阅读:(37) ⋅ 点赞:(0)

1.所需头文件

#include <QPoint>    // QPoint 类型
#include <QWidget>   // mapFromGlobal() 的父类
#include <QEvent>    // event->globalPos() 的来源(如 QMouseEvent)
#include <QContextMenuEvent> // 用于 QContextMenuEvent
#include <QMenu>             // 用于 QMenu(如果 m_contextMenu 是 QMenu 类型)

2.重写contextMenuEvent

.h文件中:

protected:
    void contextMenuEvent(QContextMenuEvent *event) override;

实例函数:

void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    //把鼠标位置转化成相对于QWidget的位置,然后判断是否在tvRecipe内.
    QPoint i = ui->tvRecipe->mapFromGlobal(event->globalPos());
    QRect rect(QPoint(0,0),ui->tvRecipe->size());
    if (rect.contains(i))
    {
        m_contextMenu->exec(event->globalPos());

    }

}  其中tvRecipe为在.ui 文件中添加的容器。

3.建立右键菜单

.h文件中定义

 QMenu *m_contextMenu;//菜单名
    QAction *m_addAction;//添加行为
    QAction *m_explodeAction;//扩展行为
    QAction *m_detailAction;//详情行为

private slots:
    void showDetail();
    void addPatient();
    void explodeAll();//对应槽函数

初始化菜单栏,建立链接,槽函数初始化

m_contextMenu = new QMenu;
    m_addAction = new QAction("增加项目",this);
    m_detailAction=new QAction("项目详情",this);
    m_explodeAction = new QAction("扩展所有",this);

    m_contextMenu->addAction(m_addAction);
    m_contextMenu->addAction(m_explodeAction);
    m_contextMenu->addAction(m_detailAction);

    connect(m_addAction, &QAction::triggered, this, &MainWindow::addPatient);
     connect(m_detailAction, &QAction::triggered, this, &MainWindow::showDetail);
     connect(m_explodeAction, &QAction::triggered, this, &MainWindow::explodeAll);

槽函数~回调函数


void MainWindow::addPatient()
{

     QMessageBox::information(this,"","addPatient");
}

void MainWindow::showDetail()
{
    QMessageBox::information(this,"","showdetail");
}


void MainWindow::explodeAll()
{
     QMessageBox::information(this,"","explodeAll");

}

4.实验效果