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

---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路



















