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.实验效果