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

全國咨詢/投訴熱線:400-618-4000

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

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

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

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

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

重寫事件處理器
void QWidget::mousePressEvent(QMouseEvent * event) 或者
void QWidget::mouseReleaseEvent(QMouseEvent * event)
當(dāng)窗口接收到鼠標(biāo)鍵消息,判斷如果按下的鼠標(biāo)右鍵則創(chuàng)建菜單對象:
QMenu menu;
給菜單對象添加菜單項(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());
    }
}
注意事項:
右鍵菜單顯示的時候使用的坐標(biāo)為屏幕坐標(biāo), 使用QCursor類的靜態(tài)函數(shù)pos()可以直接得到鼠標(biāo)右鍵按下時候的屏幕坐標(biāo)。

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

void  setContextMenuPolicy(Qt::ContextMenuPolicy policy)為QWidget的成員函數(shù),從QWidget直接或間接派生的類都可以使用該函數(shù)對右鍵菜單進(jìn)行設(shè)置。
Qt::ContextMenuPolicy是一個枚舉類型,包括:
Qt::NoContextMenu、Qt::PreventContextMenu、Qt::DefaultContextMenu、
Qt::ActionsContextMenu、Qt::CustomContextMenu
其中Qt::NoContextMenu、Qt::PreventContextMenu 不能實現(xiàn)右鍵菜單的功能。
Qt::DefaultContextMenu
設(shè)置此屬性需要重寫
void QWidget::contextMenuEvent(QContextMenuEvent * event)
事件處理器函數(shù)來實現(xiàn)右鍵菜單
示例:
在窗口構(gòu)造函數(shù)中設(shè)置右鍵菜單的處理方式:
setContextMenuPolicy(Qt::DefaultContextMenu
重寫對應(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ù)便會執(zhí)行。
Qt::ActionsContextMenu
設(shè)置此屬性后添加到當(dāng)前窗口中所有QAction都會作為右鍵菜單項顯示出來
示例:
 
在窗口構(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信號,注意僅僅只是發(fā)信號,意味著要自己寫顯示右鍵菜單的槽函數(shù)(slot)這個信號是QWidget唯一與右鍵菜單有關(guān)的信號(也是自有的唯一信號),同時也是很容易被忽略的signal:
void customContextMenuRequested ( const QPoint & pos )
該信號的發(fā)出條件是:用戶請求contextMenu(常規(guī)就是鼠標(biāo)右擊)且同時被擊的widget其contextMenuPolicy又是Qt::CustomContextMenu。
注意: 信號中的參數(shù)pos為當(dāng)前窗口的坐標(biāo),并非屏幕坐標(biāo)。
示例:
 
    // 在窗口構(gòu)造函數(shù)中設(shè)置右鍵菜單的處理方式:
    setContextMenuPolicy(Qt::CustomContextMenu);
    // 連接信號槽
connect(this, SIGNAL(customContextMenuRequested(QPoint)), 
        this, SLOT(ShowContexMenu(QPoint)));
// 自定義槽函數(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)載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://m.fskzgqt.cn/c/
0 分享到:
和我們在線交談!