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