篇一:Qt之给控件添加右键菜单
我们需要创建一个功能:右键点击,弹出菜单 功能!
具体的:右键点击的时候会发出一个信号,告知需要在点击位置pos处,创建并显示一个菜单。
因此,我们创建了一个void QWidget::customContextMenuRequested(const QPoint &pos)信号。在参数中传递点击位置pos。
这样,在信号的槽函数中:就可以知道pos,并在pos处 创建并显示一个菜单。
前提条件:先要给控件设置上下文菜单策略,之后右键点击控件,才会发送customContextMenuRequested信号!
首先需要给控件设置上下文菜单策略 setContextMenuPolicy(Qt::CustomContextMenu) ;
设置该策略后当我们右键点击控件时qt会发送一个信号 void QWidget::customContextMenuRequested(const QPoint &pos)
//只要是继承QWidget的控件都可以
pTableWidget->setContextMenuPolicy(Qt::CustomContextMenu)
ui->label->setContextMenuPolicy(Qt::CustomContextMenu);
ui->pushButton->setContextMenuPolicy(Qt::CustomContextMenu);
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.效果测试
原文链接:Qt之给控件添加右键菜单 - 知乎
篇二:在tab控件上添加 自定义菜单栏
自定义菜单栏,关键要用到一个类为QWidgetAction,它继承于QAction,
1.使用setDefaultWidget接口将 自定义窗口放到QWidgetAction中,
2.然后像添加QAction一样,使用addAction函数,将QWidgetAction添加到QMenu中就可以了。
比如,在一个tab标签页上添加一个“右键菜单栏”,实现一些动作:标签页的“上移”/“下移“/”删除”等。
QMenu* m_menu = new QMenu(this);
//菜单样式
QString menuStyle(
"QMenu::item{"
"color: rgb(10, 10, 10);"
"}"
"QMenu::item:hover{"
"background-color: rgb(170, 160, 235);"
"}"
"QMenu::item:selected{"
"background-color: rgb(176, 190, 225);"
"}"
);
QString buttonStyle(
"QPushButton{"
"color: rgb(0, 0, 0);"
"border: none;"
"text-align: left;"
"font: 9pt Microsoft YaHei;"
"padding-left: 5px;"
"padding-right: 5px;"
"min-height: 23px;"
"}"
"QPushButton::hover{"
"background-color: rgba(176, 190, 225, 200);"
"}"
"QPushButton::selected{"
"background-color: rgba(176, 190, 255, 255);"
"}"
);
m_menu->setStyleSheet(menuStyle);//设置菜单样式
QPushButton* moveUpAction_buf = new QPushButton(m_menu);
moveUpAction_buf->setStyleSheet(buttonStyle);
moveUpAction_buf->setText("上移");
moveUpAction_buf->setIconSize(QSize(20, 20));
moveUpAction_buf->setIcon(QIcon(":/res/ico/previous.png"));
QWidgetAction* moveUpAction = new QWidgetAction(this);
//1.将自定义的窗口(这里是一个QPushButton),放到QWidgetAction中
moveUpAction->setDefaultWidget(moveUpAction_buf);
connect(moveUpAction_buf, &QPushButton::clicked, this, &frmInstrumentation::slot_MoveUp);
connect(moveUpAction_buf, &QPushButton::clicked, m_menu, &QMenu::close);
//2.将QWidgetAction添加到QMenu中。“动作”添加到菜单
m_menu->addAction(moveUpAction);
QPushButton* moveDownAction_buf = new QPushButton(m_menu);
moveDownAction_buf->setStyleSheet(buttonStyle);
moveDownAction_buf->setText("下移");
moveDownAction_buf->setIconSize(QSize(20, 20));
moveDownAction_buf->setIcon(QIcon(":/res/ico/next.png"));
QWidgetAction* moveDownAction = new QWidgetAction(this);
//1.将自定义的窗口(这里是一个QPushButton),放到QWidgetAction中
moveDownAction->setDefaultWidget(moveDownAction_buf);
connect(moveDownAction_buf, &QPushButton::clicked, this, &frmInstrumentation::slot_MoveDown);
connect(moveDownAction_buf, &QPushButton::clicked, m_menu, &QMenu::close);
//2.将QWidgetAction添加到QMenu中。“动作”添加到菜单
m_menu->addAction(moveDownAction);
QPushButton* deleteNameAction_buf = new QPushButton(m_menu);
deleteNameAction_buf->setStyleSheet(buttonStyle);
deleteNameAction_buf->setText("删除");
deleteNameAction_buf->setIconSize(QSize(21, 21));
deleteNameAction_buf->setIcon(QIcon(":/res/ico/del.png"));
QWidgetAction* deleteNameAction = new QWidgetAction(this);
deleteNameAction->setDefaultWidget(deleteNameAction_buf);
connect(deleteNameAction_buf, &QPushButton::clicked, this, &frmInstrumentation::slot_DeleteName);
connect(deleteNameAction_buf, &QPushButton::clicked, m_menu, &QMenu::close);
m_menu->addAction(deleteNameAction);
//给控件设置上下文菜单策略
ui.tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
//给信号设置相应的槽函数
connect(ui.tableWidget, &QTableWidget::customContextMenuRequested, [=](const QPoint& pos)
{
//参数pos用来传递右键点击时的鼠标的坐标,这个坐标一般是相对于控件左上角
m_menu->exec(QCursor::pos());
});