对于一个大的界面而言,可以采用重写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);