在用QT編程時,有時候要實現鼠標右鍵彈出菜單的功能.下面代碼演示鼠標右鍵彈出菜單.
1.新建一個QT工程,點擊MainWindow.ui,鼠標右鍵Go to slot.....,添加customContextMenuRequested(const QPoint &pos)事件
2.找到屬性頁中的contextMenuPolicy,把DefaultContextMenu改成CustomContextMenu.保存關閉MainWindow.ui
3.在on_MainWindow_customContextMenuRequested(const QPoint &pos)函數體添加一下代碼
void MainWindow::on_MainWindow_customContextMenuRequested(const QPoint &/*pos*/)
{
//創建菜單對象
QMenu *pMenu = new QMenu(this);
QAction *pNewTask = new QAction(tr("新建任務"), this);
QAction *pEditTask = new QAction(tr("設置任務"), this);
QAction *pDeleteTask = new QAction(tr("刪除任務"), this);
QAction *pToolRenName = new QAction(tr("改名工具"), this);
QAction *pToolEdot = new QAction(tr("設置工具"), this);
QAction *pToolDelete = new QAction(tr("刪除工具"), this);
//1:新建任務 2:設置任務 3:刪除任務 4:改名工具 5:設置工具 6:刪除工具
pNewTask->setData(1);
pEditTask->setData(2);
pDeleteTask ->setData(3);
pToolRenName->setData(4);
pToolEdot->setData(5);
pToolDelete ->setData(6);
//把QAction對象添加到菜單上
pMenu->addAction(pNewTask);
pMenu->addAction(pEditTask);
pMenu->addAction(pDeleteTask);
pMenu->addAction(pToolRenName);
pMenu->addAction(pToolEdot);
pMenu->addAction(pToolDelete);
//連接鼠標右鍵點擊信號
connect(pNewTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pEditTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pDeleteTask, SIGNAL(triggered()), SLOT(onTaskBoxContextMenuEvent()));
connect(pToolRenName, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pToolEdot, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pToolDelete, SIGNAL(triggered()), SLOT(onTaskBoxContextMenuEvent()));
//在鼠標右鍵點擊的地方顯示菜單
pMenu->exec(cursor().pos());
//釋放內存
QList<QAction*> list = pMenu->actions();
foreach (QAction* pAction, list) delete pAction;
delete pMenu;
}
void MainWindow::onTaskBoxContextMenuEvent()
{
QAction *pEven = qobject_cast<QAction *>(this->sender()); //this->sender()就是發信號者 QAction
//獲取發送信息類型 1:新建任務 2:設置任務 3:刪除任務 4:改名工具 5:設置工具 6:刪除工具
int iType = pEven->data().toInt();
switch (iType)
{
case 1:
QMessageBox::about(this, "tip", pEven->text());
break;
case 2:
QMessageBox::about(this, "tip", pEven->text());
break;
case 3:
QMessageBox::about(this, "tip", pEven->text());
break;
case 4:
QMessageBox::about(this, "tip", pEven->text());
break;
case 5:
QMessageBox::about(this, "tip", pEven->text());
break;
case 6:
QMessageBox::about(this, "tip", pEven->text());
break;
default:
break;
}
}
4.運行結果如下所示: