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.效果测试