Qt学习之给QPushButton添加菜单CustomContextMenu方法

                      欢迎关注公众号可以查看更多完整文章

上篇也说了,题目虽然说是给QPushButton添加鼠标右键菜单,其实对于所有的QWidget都是适用的。之所以说QPushButton,是以QPushButton为例进行实现,写的类继承自QPushButton。上篇是说使用ActionsContextMenu,现在换一种方法来实现给QWidget添加右键菜单。下面的方法是使用CustomContextMenu方式来实现。

使用CustomContextMenu方式添加右键菜单,要实现一个QMenu,里面包含你需要的QAction,使用ActionsContextMenu就只需要包含自己需要的QAction就可以了,并不需要创建一个QMenu。

首先在头文件中声明成员变量,并包含所需要的头文件:

private:
	QMenu *m_menu;
	QAction *m_actionOne;
	QAction *m_actionTwo;
	QAction *m_actionThree;

声明所需要的槽函数:最上面的槽函数是用来显示菜单所需要的,另外三个是三个QAction所对应的槽:

protected slots:
	void showMenu(const QPoint &point);
	void actionOneSlot();
	void actionTwoSlot();
	void actionThreeSlot();

在构造函数中,需要设置使用菜单的策略:

setContextMenuPolicy(Qt::CustomContextMenu);

然后是创建QMenu和QAction,将QAction添加到QMenu并设置Action的名称和连接对应的槽函数:

m_menu = new QMenu(this);
	m_actionOne = new QAction(this);
	m_actionTwo = new QAction(this);
	m_actionThree = new QAction(this);

	m_actionOne->setText("ActionOne");
	m_actionTwo->setText("ActionTwo");
	m_actionThree->setText("ActionThree");

	m_menu->addAction(m_actionOne);
	m_menu->addAction(m_actionTwo);
	m_menu->addAction(m_actionThree);

	connect(m_actionOne, SIGNAL(triggered()), this, SLOT(actionOneSlot()));
	connect(m_actionTwo, SIGNAL(triggered()), this, SLOT(actionTwoSlot()));
	connect(m_actionThree, SIGNAL(triggered()), this, SLOT(actionThreeSlot()));

接下来是和设置使用菜单策略同样重要的,连接菜单请求信号以及显示菜单的槽,可以看到是以点(QPoint)为参数的,也就是鼠标Cursor光标所在的位置:

connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)));

接下来是实现QAction对应的槽函数,以及显示菜单的槽,前者上一篇已经提到,下面只说显示菜单的槽函数:接收到信号传过来的QPoint后,给QMenu显示使用:

void CustomMenu::showMenu(const QPoint &point)
{
	m_menu->exec(point);
}

然后编译运行都没问题,但是显示时发现有一个问题:

菜单显示的位置,并不在光标处。调试查看QPoint的值,发现QPoint的值是光标在界面上的位置,但是菜单显示却是针对显示器来显示的。所以需要转换城全局坐标,可以使用mapToGlobal函数:

void CustomMenu::showMenu(const QPoint &point)
{
	m_menu->exec(mapToGlobal(point));
}

然后重新编译运行,可以看到显示正常:



点击相应的动作,可以在控制台看到输出:

完整代码:

#include <QtWidgets/QPushButton>
#include <QAction>
#include <QMenu>
#include <QDebug>

class CustomMenu : public QPushButton
{
	Q_OBJECT

public:
	CustomMenu(QWidget *parent = 0);
	~CustomMenu();

protected slots:
	void showMenu(const QPoint &point);
	void actionOneSlot();
	void actionTwoSlot();
	void actionThreeSlot();

private:
	QMenu *m_menu;
	QAction *m_actionOne;
	QAction *m_actionTwo;
	QAction *m_actionThree;
};

#include "custommenu.h"

CustomMenu::CustomMenu(QWidget *parent)
	: QPushButton(parent)
{
	setContextMenuPolicy(Qt::CustomContextMenu);

	m_menu = new QMenu(this);
	m_actionOne = new QAction(this);
	m_actionTwo = new QAction(this);
	m_actionThree = new QAction(this);

	m_actionOne->setText("ActionOne");
	m_actionTwo->setText("ActionTwo");
	m_actionThree->setText("ActionThree");

	m_menu->addAction(m_actionOne);
	m_menu->addAction(m_actionTwo);
	m_menu->addAction(m_actionThree);

	connect(m_actionOne, SIGNAL(triggered()), this, SLOT(actionOneSlot()));
	connect(m_actionTwo, SIGNAL(triggered()), this, SLOT(actionTwoSlot()));
	connect(m_actionThree, SIGNAL(triggered()), this, SLOT(actionThreeSlot()));

	connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)));
}

CustomMenu::~CustomMenu()
{

}

void CustomMenu::showMenu(const QPoint &point)
{
	m_menu->exec(mapToGlobal(point));
}

void CustomMenu::actionOneSlot()
{
	qDebug() << "actionOne";
}

void CustomMenu::actionTwoSlot()
{
	qDebug() << "actionTwo";
}

void CustomMenu::actionThreeSlot()
{
	qDebug() << "actionThree";
}
#include "custommenu.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QWidget w;
	CustomMenu b(&w);
	b.setText("Button");
	w.show();
	return a.exec();
}

源码下载:Qt学习之QPushButton添加右键菜单_qpushbutton右键菜单-C++代码类资源-CSDN下载

本文地址:Qt学习之给QPushButton添加菜单CustomContextMenu方法_GreenArrowMan-CSDN博客-CSDN博客

交流QQ:1245178753

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenArrowMan

请打钱~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值