教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

C++培訓(xùn)之Qt右鍵菜單的添加

更新時(shí)間:2015年12月28日16時(shí)36分 來(lái)源:傳智播客C/C++學(xué)科 瀏覽次數(shù):

創(chuàng)建Qt鼠標(biāo)右鍵菜單

在平時(shí)使用Qt程序開(kāi)發(fā)的時(shí)候,很多時(shí)候都會(huì)涉及到鼠標(biāo)右鍵菜單的操作,以下對(duì)鼠標(biāo)右鍵菜單的創(chuàng)建做一個(gè)系統(tǒng)的介紹:
菜單的創(chuàng)建方法主要分為兩種:

第一種:通過(guò)事件處理器實(shí)現(xiàn)

重寫(xiě)事件處理器
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類(lèi)的靜態(tài)函數(shù)pos()可以直接得到鼠標(biāo)右鍵按下時(shí)候的屏幕坐標(biāo)。

第二種:使用與右鍵菜單有關(guān)的函數(shù)setContextMenuPolicy()

void  setContextMenuPolicy(Qt::ContextMenuPolicy policy)為QWidget的成員函數(shù),從QWidget直接或間接派生的類(lèi)都可以使用該函數(shù)對(duì)右鍵菜單進(jìn)行設(shè)置。
Qt::ContextMenuPolicy是一個(gè)枚舉類(lèi)型,包括:
Qt::NoContextMenu、Qt::PreventContextMenu、Qt::DefaultContextMenu、
Qt::ActionsContextMenu、Qt::CustomContextMenu
其中Qt::NoContextMenu、Qt::PreventContextMenu 不能實(shí)現(xiàn)右鍵菜單的功能。
Qt::DefaultContextMenu
設(shè)置此屬性需要重寫(xiě)
void QWidget::contextMenuEvent(QContextMenuEvent * event)
事件處理器函數(shù)來(lái)實(shí)現(xiàn)右鍵菜單
示例:
在窗口構(gòu)造函數(shù)中設(shè)置右鍵菜單的處理方式:
setContextMenuPolicy(Qt::DefaultContextMenu
重寫(xiě)對(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í)行。
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);
Qt:: CustomContextMenu
它是發(fā)出QWidget::customContextMenuRequested信號(hào),注意僅僅只是發(fā)信號(hào),意味著要自己寫(xiě)顯示右鍵菜單的槽函數(shù)(slot)這個(gè)信號(hào)是QWidget唯一與右鍵菜單有關(guān)的信號(hào)(也是自有的唯一信號(hào)),同時(shí)也是很容易被忽略的signal:
void customContextMenuRequested ( const QPoint & pos )
該信號(hào)的發(fā)出條件是:用戶(hù)請(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://metathetuscanyresort.com/c/
0 分享到:
和我們?cè)诰€(xiàn)交談!