给控件添加 自定义右键菜单栏

篇一: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());
	});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值