关于Qt创建右键菜单的几种方式

右键菜单的使用挺频繁的,以前或多或少使用了几种,今天来统一合计一下。

对于界面:重写mousePressEvent

对于一个大的界面而言,可以采用重写mousePressEvent的方式来实现右键菜单,缺点是只能在界面上没有控件的地方才能显示(以我目前试验的结果得到的结论),如果有控件,那么这个菜单就不会显示了。
代码如下:

.h文件
protected:
	virtual void mousePressEvent(QMouseEvent *pEvent);
.cpp文件
xxx::mousePressEvent(QMouseEvent *pEvent)
{
	if (Qt::RightButton == pEvent)
	{
		QMenu *pMenu= ..;
		QAction *pAct1 = ...;
		QAction *pAct2 = ...;
		pMenu->addAction(pAct1);
		pMenu->addAction(pAct2);
		pMenu->exec(pEvent->globalPos();
	}

	pEvent->accept();
}

对于控件:重写控件或者是使用相关联的QAction列表

1. 重写控件
此处可以采用鼠标点击事件的方式,方法同上,这种方法不多做介绍。
着重介绍一下重写QWidget::contextMenuEvent()函数这种方法。
代码如下:

.h文件
protected:
	virtual void mousePressEvent(QMouseEvent *pEvent);
.cpp文件
xxx::contextMenuEvent(QContextMenuEvent*pEvent)
{
	if (pEvent->MouseButtonPress)
	{
		QMenu *pMenu= ..;
		QAction *pAct1 = ...;
		QAction *pAct2 = ...;
		pMenu->addAction(pAct1);
		pMenu->addAction(pAct2);
		pMenu->exec(pEvent->globalPos();
	}

	pEvent->accept();
}

方法同鼠标事件很类似,不同点在于,这里可以自己决定使用的是鼠标的方式还是注入键盘的方式。

2. 使用Qt窗口部件本身支持的QActios列表
这种方法才是我今天着重要说的一种方法,也是我刚刚学到的方法。
优点在于对于单个的控件,可以不采用重写控件的方式就可以实现右键菜单。
比如我已经在UI文件里面添加了一个QTableWidget,我现在对其进行添加右键菜单。代码如下:

		QAction *pAct1 = ...;
		QAction *pAct2 = ...;
		ui->tableWidget->addAction(pAct1);
		ui->tableWidget->addAction(pAct2);
		ui->tableWidget->setContextMenuPolicy(Qt::ActionsContextMenu);

如上面的代码显示,QWidget本身即可添加QActions列表,方法非常简单,而且也不需要同其他的方式那样需要显式地调用exec进行显示,而是在设置setContextMenuPolicy(Qt::ActionsContextMenu)这个属性之后自动就可以根据鼠标的右键点击进行显示了,操作极为简单。
因此,对于一些右键菜单不是特别复杂的控件来说,我极力推荐这种方式。

补充:
值得注意的是,如果涉及到鼠标的位置,需要开启鼠标追踪:

xxx->setMouseTracking(true);
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值