Qt系列文章之 右键菜单QMenu(上)
上一篇文章介紹了自定義用戶窗體并提升到ui文件中的操作流程,本文介紹用戶界面上常用的右鍵菜單欄的創建。
右鍵菜單QMenu
用戶界面鼠標交互是十分常見的人機交互形式,大部分窗體軟件都具備類似右鍵鼠標出現一個菜單欄,用戶可選擇需要的操作動作。本文基于上一文的場景,介紹如何在一個表格窗體中右鍵出現一個用戶可以選擇動作的菜單欄。由于右鍵動作只是針對表格窗體,必然這個菜單欄也需要在用戶自定義窗體中進行開發,作為用戶窗體屬性的一部分。
首先在用戶窗體的頭文件之中包含需要的兩個頭文件:
#include <QMenu> #include <QAction>然后在私有屬性中定義一個QMenu對象指針:
private:QMenu *m_menu; //新建一個Menu屬性在CPP文件中的構造函數中為菜單指針初始化空間,注意QMenu傳入的參數是this,這樣將用戶窗體作為菜單的父類,進入父類的繼承體系,在父類析構時會先自動析構其所有子類,因此在析構函數中就沒有必要對m_menu進行空間釋放。
CustomTableWidget::CustomTableWidget(QWidget *parent):QTableWidget(parent),m_menu(new QMenu(this)) {然后定義幾個菜單動作:
QAction * addRow = new QAction("Add one row"); //定義為表格添加一行的動作QAction * removeRow = new QAction("Remove one row"); //定義從表格中刪除一行的動作QAction *removeAllRow = new QAction("Remove all rows"); //定義刪除表格所有行動作將定義好的動作添加到菜單之中:
m_menu->addAction(addRow); //添加動作到菜單m_menu->addAction(removeRow); //添加動作到菜單m_menu->addSeparator(); //添加一個分隔符m_menu->addAction(removeAllRow); //添加動作到菜單當用戶在表格中鼠標點擊右鍵時,在鼠標點擊的位置出現定義的菜單,那么有三個問題需要具體考慮:如何獲取鼠標點擊了右鍵,第二如何獲取鼠標位置,第三如何交互式顯示菜單。
如何獲取鼠標點擊了右鍵,可以參考上一文中對鼠標輸入控件的捕捉:
else if (event->button()==Qt::RightButton) //捕獲鼠標右鍵輸入{如何獲取鼠標位置,從代碼中看,唯一能夠和鼠標位置有關系的只能是QMouseEvent對象。觀看一下QMouseEvent提供的方法有兩個和位置相關,pos()和globalPos(),具體那個合適,可以自行閱讀方法的幫助。 其實最好的方法就是都試用一下,測試之后就會明白:
此處先試用pos()來獲取鼠標的位置。
else if (event->button()==Qt::RightButton) //捕獲鼠標右鍵輸入{QPoint mousePos = event->pos(); //獲取鼠標位置如何顯示菜單,可以閱讀QMemu的幫助,有一個方法exec(),其輸入就是一個位置QPOint:
根據提示,顯示菜單:
else if (event->button()==Qt::RightButton) //捕獲鼠標右鍵輸入{QPoint mousePos = event->pos(); //獲取鼠標位置m_menu->exec(mousePos); //顯示菜單}編譯運行代碼,在表格窗體之中點擊鼠標右鍵,看看界面會發生什么:
有意思的是菜單并沒有顯示在表格窗體之中,而是顯示在窗體之外。顯然使用pos()函數獲取鼠標位置是不對的,需要使用globalPos()。 pos()獲取的是鼠標在子窗體局部坐標系的位置,globalPos()獲取的是鼠標在操作系統桌面全局坐標系下的位置。而菜單對象的exec()函數需要的參數是全局坐標系下的位置。 將代碼進行修改:
void CustomTableWidget::mousePressEvent(QMouseEvent *event) {if(event->button()==Qt::LeftButton){qDebug()<<"table mouse press event";}else if (event->button()==Qt::RightButton) //捕獲鼠標右鍵輸入{QPoint mousePos = event->globalPos(); //此處調用鼠標的globalPos()而不是pos(),pos()輸出是相對當前子窗體的位置m_menu->exec(mousePos); //顯示菜單}return QTableWidget::mousePressEvent(event); //記得返回基類的時間處理函數 }編譯運行代碼,再在窗體點擊鼠標右鍵,觀察界面的響應:
本文用戶表格窗體的h文件代碼:
本文用戶表格窗體的cpp文件代碼:
#include "customtablewidget.h" #include <QDebug>CustomTableWidget::CustomTableWidget(QWidget *parent):QTableWidget(parent),m_menu(new QMenu(this)) {QAction * addRow = new QAction("Add one row"); //定義為表格添加一行的動作QAction * removeRow = new QAction("Remove one row"); //定義從表格中刪除一行的動作QAction *removeAllRow = new QAction("Remove all rows"); //定義刪除表格所有行動作m_menu->addAction(addRow); //添加動作到菜單m_menu->addAction(removeRow); //添加動作到菜單m_menu->addSeparator(); //添加一個分隔符m_menu->addAction(removeAllRow); //添加動作到菜單 }void CustomTableWidget::mousePressEvent(QMouseEvent *event) {if(event->button()==Qt::LeftButton){qDebug()<<"table mouse press event";}else if (event->button()==Qt::RightButton) //捕獲鼠標右鍵輸入{QPoint mousePos = event->globalPos(); //此處調用鼠標的globalPos()而不是pos(),pos()輸出是相對當前子窗體的位置m_menu->exec(mousePos); //顯示菜單}return QTableWidget::mousePressEvent(event); //記得返回基類的時間處理函數 }下一文將繼續介紹QMenu怎么實現Action和表格操作的關聯。
歡迎同好溝通交流,批評指正,歡迎關注我的公號:不如起而行之
總結
以上是生活随笔為你收集整理的Qt系列文章之 右键菜单QMenu(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族手机装Xposed框架
- 下一篇: RF射频卡的介绍与与手机NFC的通信