1. 程式人生 > >Qt之右鍵選單

Qt之右鍵選單

1、右鍵選單建立和顯示

作為一種互動性強、使用方便的右鍵選單在程式中是非常常用的,在Qt中可以輕鬆的實現。

QMenu menu; 
//新增選單項,指定圖示、名稱、響應函式
menu.addAction(QIcon("1.png"), QStringLiteral("新增"),this,SLOT(OnBscGroupRightAction())); 
//在滑鼠位置顯示
menu.exec(QCursor::pos());

2、右鍵選單關聯控制元件

QWidget及其子類都可有右鍵選單,首先設定QWidget與右鍵選單有關的函式setContextMenuPolicy(),屬性對應項為contextmenuPolicy。

setContextMenuPolicy函式的引數為列舉型別Qt::ContextMenuPolicy,qt幫助文件中有相應介紹:

image

a、Qt::DefaultContextMenu

預設是Qt::DefaultContextMenu,它是利用右鍵選單事件contextMenuEvent()來處理(which means the contextMenuEvent() handler is called)。就是要重寫contextMenuEvent( QContextMenuEvent * event )函式。

你可以通過UI屬性來設定:

image

void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu Context;
    Context.addAction(ui->actionAdd);
    Context.exec(QCursor::pos());
}

b、Qt::CustomContextMenu

它是發出QWidget::customContextMenuRequested訊號,注意僅僅只是發訊號,意味著要自己寫顯示右鍵選單的slot。這個訊號是QWidget唯一與右鍵選單有關的訊號(也是自有的唯一訊號),同時也是很容易被忽略的signal: 
void customContextMenuRequested ( const QPoint & pos )

一般來說為了方便,我們會省略自己新增connect來關聯槽函式,而是採用預設的槽函式,預設槽函式命名規則:void on_控制元件ID_customContextMenuRequested(const QPoint &pos);

void BscServer::on_treeView_customContextMenuRequested(const QPoint &pos) 
{ 
    QModelIndex index=ui.treeView->currentIndex(); 
    QStandardItem *item = m_pMenuMgr->GetModel()->itemFromIndex(index);
    CMenuItemData *data = dynamic_cast<CMenuItemData*>(item);
    //根據右鍵類容顯示選單
    ShowContextMenu(data);
}

c、Qt::ActionsContextMenu

該型別比較簡單,直接使用QWidget::actions()函式新增動作即可,點選右鍵就會自動彈出選單。

如對於QTableView控制元件,設定如下:

image

   //新增右鍵菜
    ui.tableView->addAction(ui.action_add);
    ui.tableView->addAction(ui.action_del);
    //右鍵處理事件
    connect(ui.action_add, SIGNAL(triggered()), this, SLOT(addRecord()));
    connect(ui.action_del, SIGNAL(triggered()), this, SLOT(delRecord()));