自定义右键菜单
最后更新于:2022-04-02 02:11:27
[TOC]
## 概述
右键菜单功能很常见,我们添加槽函数的操作就是通过右键菜单实现的。在 Qt 库中,每一条菜单项称为 QAction,多条菜单项组成一个菜单,菜单类是 QMenu。菜单项 QAction 不仅可以用于菜单,工具栏的按钮也是 QAction 实现的。QAction 常用构造函数如下:
```
QAction(const QString & text, QObject * parent)
QAction(const QIcon & icon, const QString & text, QObject * parent)
// 信号
void QAction::triggered(bool checked = false) //点击菜单项触发信号
// checked 一般在菜单可勾选才用到
void QAction::setCheckable(bool) // 设置勾选菜单
// 单独的菜单项是不能弹出显示的,需要将菜单项添加到菜单或工具栏才能使用
QMenu(QWidget * parent = 0)
QMenu(const QString & title, QWidget * parent = 0)
```
## 实例
```
//创建右键菜单对象
m_menuContext = new QMenu(tr("ContextMenu")); //右键菜单其实不显示ContextMenu文本
//创建“添加条目”菜单项并添加到菜单
QAction *actAdd = new QAction(tr("添加条目"), this);
m_menuContext->addAction( actAdd );
//创建“编辑条目”菜单项并添加到菜单
QAction *actEdit = new QAction(tr("编辑条目"), this);
m_menuContext->addAction( actEdit );
//创建“删除条目”菜单项并添加到菜单
QAction *actDel = new QAction(tr("删除条目"), this);
m_menuContext->addAction( actDel );
//创建“清空所有”菜单项并添加到菜单
QAction *actClearAll = new QAction(tr("清空所有"), this);
m_menuContext->addAction( actClearAll );
//设置列表控件可以有自定义右键菜单
ui->listWidget->setContextMenuPolicy( Qt::CustomContextMenu );
//关联弹出菜单信号
connect(ui->listWidget, SIGNAL(customContextMenuRequested(QPoint)),
this, SLOT(onCustomContextMenuRequested(QPoint)) );
//为四个菜单项关联点击信号到槽函数
connect(actAdd, SIGNAL(triggered()), this, SLOT(onAddItemTriggered()));
connect(actEdit, SIGNAL(triggered()), this, SLOT(onEditItemTriggered()));
connect(actDel, SIGNAL(triggered()), this, SLOT(onDelItemTriggered()));
connect(actClearAll, SIGNAL(triggered()), this, SLOT(onClearAllTriggered()));
//弹出右键菜单的槽函数
void Widget::onCustomContextMenuRequested(const QPoint & pos)
{
//控件内的相对坐标转为屏幕坐标
//是列表控件发出的信号,就用列表控件的转换函数
QPoint screenPos = ui->listWidget->mapToGlobal( pos );
//弹出菜单
QAction *actRet = m_menuContext->exec( screenPos );
if(NULL != actRet)//检查非空才能使用该指针
{
qDebug()<text();
}
}
```
';