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.實驗效果