1.重點
既然要給控件添加右鍵菜單,那如何讓控件知道我們點擊了它呢?
首先需要給控件設置上下文菜單策略 setContextMenuPolicy(Qt::CustomContextMenu) ;設置該策略后當我們右鍵點擊控件時qt會發送一個信號 void QWidget::customContextMenuRequested(const QPoint &pos) ,其中參數pos用來傳遞右鍵點擊時的鼠標的坐標,這個坐標一般是相對於控件左上角而言的;最后給這個信號設置相應的槽函數,在槽函數中將菜單展示出來就行了。
2.步驟概覽
//初始化動作
//初始化菜單
//動作添加到菜單
//給動作設置信號槽
//給控件設置上下文菜單策略
//給信號 void QWidget::customContextMenuRequested(const QPoint &pos)設置相應的槽函數
3.代碼實現
在例子中我給PushBUtton添加了一個菜單,菜單中加入了兩個動作,分別給每個動作設置信號槽;同樣給TextLabel添加一個菜單,菜單中加入了兩個動作,分別給每個動作設置信號槽。
3.1界面

3.2詳細代碼
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include<QAction> #include<QMenu> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; //聲明動作 QAction * buttonAction1; QAction * buttonAction2; QAction * lableAction1; QAction * lableAction2; //聲明菜單 QMenu * buttonMenu; QMenu * lableMenu; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include<QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //初始化動作 buttonAction1 = new QAction("btnFirstAction",this); buttonAction2 = new QAction("btnSecondAction",this); lableAction1 = new QAction("lbFirstAction",this); lableAction2 = new QAction("lbSecondAction",this); //初始化菜單 buttonMenu = new QMenu(this); lableMenu = new QMenu(this); //動作添加到菜單 buttonMenu->addAction(buttonAction1); buttonMenu->addAction(buttonAction2); lableMenu->addAction(lableAction1); lableMenu->addAction(lableAction2); //給動作設置信號槽 connect( buttonAction1, &QAction::triggered, [=]() { qDebug()<<"I'm btnFirstAction"; }); connect( buttonAction2, &QAction::triggered, [=]() { qDebug()<<"I'm btnSecondAction"; }); connect( lableAction1, &QAction::triggered, [=]() { qDebug()<<"I'm lbFirstAction"; }); connect( lableAction2, &QAction::triggered, [=]() { qDebug()<<"I'm lbSecondAction"; }); //給控件設置上下文菜單策略 ui->label->setContextMenuPolicy(Qt::CustomContextMenu); //鼠標右鍵點擊控件時會發送一個void QWidget::customContextMenuRequested(const QPoint &pos)信號 //給信號設置相應的槽函數 connect(ui->label,&QLabel::customContextMenuRequested,[=](const QPoint &pos) { qDebug()<<pos;//參數pos用來傳遞右鍵點擊時的鼠標的坐標,這個坐標一般是相對於控件左上角而言的 lableMenu->exec(QCursor::pos()); }); ui->pushButton->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->pushButton,&QPushButton::customContextMenuRequested,[=](const QPoint &pos) { qDebug()<<pos; buttonMenu->exec(QCursor::pos()); }); } MainWindow::~MainWindow() { delete ui; }
4.效果測試

