創(chuàng)建Qt鼠標(biāo)右鍵菜單
在平時(shí)使用Qt程序開發(fā)的時(shí)候,很多時(shí)候都會(huì)涉及到鼠標(biāo)右鍵菜單的操作,以下對(duì)鼠標(biāo)右鍵菜單的創(chuàng)建做一個(gè)系統(tǒng)的介紹:
菜單的創(chuàng)建方法主要分為兩種:
第一種:通過(guò)事件處理器實(shí)現(xiàn)
重寫事件處理器
void
QWidget::mousePressEvent(QMouseEvent * event) 或者
void
QWidget::mouseReleaseEvent(QMouseEvent * event)
當(dāng)窗口接收到鼠標(biāo)鍵消息,判斷如果按下的鼠標(biāo)右鍵則創(chuàng)建菜單對(duì)象:
QMenu menu;
給菜單對(duì)象添加菜單項(xiàng)(QAction)
QAction* action1 = menu.addAction("C++學(xué)院");
QAction* action2 = menu.addAction("C++游戲?qū)W院");
顯示右鍵菜單:
menu.exec(QCursor::pos());
示例:
void Widget::
mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::RightButton)
{
QMenu menu;
QAction* action1 = menu.addAction("C++學(xué)院");
QAction* action2 = menu.addAction("C++游戲?qū)W院");
menu.exec(QCursor::pos());
}
}
注意事項(xiàng):
右鍵菜單顯示的時(shí)候使用的坐標(biāo)為屏幕坐標(biāo), 使用QCursor類的靜態(tài)函數(shù)pos()可以直接得到鼠標(biāo)右鍵按下時(shí)候的屏幕坐標(biāo)。
第二種:使用與右鍵菜單有關(guān)的函數(shù)setContextMenuPolicy()
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)為QWidget的成員函數(shù),從QWidget直接或間接派生的類都可以使用該函數(shù)對(duì)右鍵菜單進(jìn)行設(shè)置。
Qt::ContextMenuPolicy是一個(gè)枚舉類型,包括:
Qt::NoContextMenu、Qt::PreventContextMenu、Qt::DefaultContextMenu、
Qt::ActionsContextMenu、Qt::CustomContextMenu
其中Qt::NoContextMenu、Qt::PreventContextMenu 不能實(shí)現(xiàn)右鍵菜單的功能。
l
Qt::DefaultContextMenu
設(shè)置此屬性需要重寫
void
QWidget::contextMenuEvent(QContextMenuEvent * event)
事件處理器函數(shù)來(lái)實(shí)現(xiàn)右鍵菜單
示例:
在窗口構(gòu)造函數(shù)中設(shè)置右鍵菜單的處理方式:
setContextMenuPolicy(
Qt::DefaultContextMenu)
重寫對(duì)應(yīng)的事件處理器函數(shù):
void Widget::contextMenuEvent(QContextMenuEvent *ev)
{
QMenu menu;
QAction* action1 = menu.addAction("C++學(xué)院");
QAction* action2 = menu.addAction("C++游戲?qū)W院");
menu.exec(QCursor::pos());
}
在窗口中單擊鼠標(biāo)右鍵,
contextMenuEvent函數(shù)便會(huì)執(zhí)行。
l
Qt::ActionsContextMenu
設(shè)置此屬性后添加到當(dāng)前窗口中所有QAction都會(huì)作為右鍵菜單項(xiàng)顯示出來(lái)
示例:
在窗口構(gòu)造函數(shù)中設(shè)置右鍵菜單的處理方式:
setContextMenuPolicy(
Qt:: ActionsContextMenu)
在當(dāng)前窗口中添加QAction:
QAction* action1 = new QAction("C++學(xué)院", this);
QAction* action2 = new QAction("C++游戲?qū)W院", this);
this->addAction(action1);
this->addAction(action2);
l
Qt:: CustomContextMenu
它是發(fā)出QWidget::customContextMenuRequested信號(hào),注意僅僅只是發(fā)信號(hào),意味著要自己寫顯示右鍵菜單的槽函數(shù)(slot)這個(gè)信號(hào)是QWidget唯一與右鍵菜單有關(guān)的信號(hào)(也是自有的唯一信號(hào)),同時(shí)也是很容易被忽略的signal:
void customContextMenuRequested ( const QPoint & pos )
該信號(hào)的發(fā)出條件是:用戶請(qǐng)求contextMenu(常規(guī)就是鼠標(biāo)右擊)且同時(shí)被擊的widget其contextMenuPolicy又是Qt::CustomContextMenu。
注意: 信號(hào)中的參數(shù)pos為當(dāng)前窗口的坐標(biāo),并非屏幕坐標(biāo)。
示例:
// 在窗口構(gòu)造函數(shù)中設(shè)置右鍵菜單的處理方式:
setContextMenuPolicy(Qt::CustomContextMenu);
// 連接信號(hào)槽
connect(this, SIGNAL(customContextMenuRequested(QPoint)),
this, SLOT(ShowContexMenu(QPoint)));
// 自定義槽函數(shù)實(shí)現(xiàn)
void Widget::ShowContexMenu(const QPoint &pos)
{
QMenu menu;
QAction* action1 = menu.addAction("C++學(xué)院");
QAction* action2 = menu.addAction("C++游戲?qū)W院");
// 坐標(biāo)系轉(zhuǎn)換
QPoint newPt = this->mapToParent(pos);
menu.exec(newPt);
// 直接獲取屏幕坐標(biāo)也可以
// menu.exec(QCursor::pos());
}
本文版權(quán)歸傳智播客C++培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/c/