目錄
常用設置函數
多個QAction的單選設置
???????菜單相關類
??????? 系統菜單的生成和響應
使用代碼添加系統菜單
使用UI設計器設計系統菜單
使用Qt設計及界面時,常用的兩種方式添加菜單,第一使用UI界面添加,第二種 在代碼中添加菜單。
常用設置函數
action->setChecked(true);?? // 設置為選中狀態
??????? 多個QAction的單選設置
void MainWindow::initUi() { ??? QActionGroup* toolGroup = new QActionGroup(this); ??? toolGroup->addAction(this->ui->drawLine); ??? toolGroup->addAction(this->ui->drawCircle); ??? toolGroup->addAction(this->ui->drawEllipse); ??? toolGroup->addAction(this->ui->selectTool); ??? toolGroup->addAction(this->ui->fillPolygon); ??? toolGroup->addAction(this->ui->fillFence); ??? toolGroup->addAction(this->ui->drawPolygon); ??? toolGroup->setExclusionPolicy(QActionGroup::ExclusionPolicy::ExclusiveOptional); } |
???????菜單相關類
QMenuBar?--菜單欄類,即下圖中紅色區域標記,菜單欄類給窗口提供水平菜單欄,此菜單欄占用窗口上方區域,垂直高度不變,水平寬度為窗口寬度,可隨窗口大小變化而變化。如下圖中“測試”,“test1”,"test2"所在的欄幾位QMenuBar
QMenu?--菜單項,即下圖中綠色區域,下圖中“測試”,"test1","test2"都是一個獨立的菜單,包含各個子菜單。QMenu還可以用來創建彈出菜單。
QAction?--子菜單,即下圖中藍色區域標記的內容,一個子菜單對應一個操作。
??????? 系統菜單的生成和響應
使用代碼添加系統菜單
示例源碼:
.h文件
#ifndef ????MAINWINDOW_H #define ???MAINWINDOW_H #include ?<QMainWindow> #include ?<QMenuBar> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class ?MainWindow : public QMainWindow { ??? Q_OBJECT public: ??? MainWindow(QWidget *parent = nullptr); ??? ~MainWindow(); ??? //菜單欄 ??? QMenuBar *pMenuBar; ??? //菜單項 ??? QMenu *pMenuTest; ??? QMenu *pMenuTest1; ??? QMenu *pMenuTest2; ??? //子菜單 ??? QAction *pActionTest; ??? QAction *pActionTest1; ??? QAction *pActionTest2; ??? QAction *pActionTest3; ??? QAction *pActionTest4; ??? QAction *pActionTest5; ??? QAction *pActionTest6; public slots: ?? ?//菜單響應函數 ??? void OnActionTest(); ??? void OnActionTest1(); private: ??? Ui::MainWindow *ui; }; #endif ????????????//MAINWINDOW_H |
.cpp文件
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDialog> //是否啟用QMainWindow自帶的菜單欄 //#define USE_DEFAULT_MENU_BAR MainWindow::MainWindow(QWidget *parent) ??? : QMainWindow(parent) ??? , ui(new Ui::MainWindow) { ??? ui->setupUi(this); ??? //指定菜單欄 #ifdef ??USE_DEFAULT_MENU_BAR ??? //添加菜單欄(此處添加為的為QMainWindow自帶的菜單) ??? pMenuBar = this->menuBar(); #else ??? //添加自定義菜單 ??? pMenuBar = new QMenuBar(this); #endif ??? //定義菜單項 ??? //(&n)代表快捷方式,當窗口獲得焦點時按alt+n即可打開“測試”菜單項 ??? pMenuTest = new QMenu("測試(&n)",this); ??? pMenuTest1 = new QMenu("test1",this); ??? pMenuTest2 = new QMenu("test2",this); ??? //定義子菜單 ??? //(&s)為子菜單快捷鍵,當打開該菜單項后,按下‘s’鍵即可響應 ??? pActionTest = new QAction("測試(&s)",this); ?? ?//新建一個帶圖標的菜單項,圖標使用資源文件中的資源 ??? pActionTest1 = new QAction(QIcon(":/new/prefix1/resource/soccer_ball.ico"),"測試1",this); ??? pActionTest2 = new QAction("測試2",this); ??? pActionTest3 = new QAction("測試3(&Y)",this); ??? pActionTest4 = new QAction("測試4",this); ??? pActionTest5 = new QAction("測試5(&M)",this); ??? pActionTest6 = new QAction("測試6",this); ??? //將菜單項添加到子菜單 ??? pMenuTest->addAction(pActionTest); ??? pMenuTest->addAction(pActionTest1); ?? ?//在菜單項之間添加分割線 ??? pMenuTest->addSeparator(); ??? pMenuTest->addAction(pActionTest2); ??? pMenuTest1->addAction(pActionTest3); ??? pMenuTest1->addAction(pActionTest4); ??? pMenuTest2->addAction(pActionTest5); ??? pMenuTest2->addAction(pActionTest6); ??? //將子菜單添加到菜單欄 ??? pMenuBar->addMenu(pMenuTest); ??? pMenuBar->addMenu(pMenuTest1); ??? pMenuBar->addMenu(pMenuTest2); #ifndef ???USE_DEFAULT_MENU_BAR ?? ?//當不使用QMainWindow自帶的菜單欄時,必須要加上此行 ??? setMenuBar(pMenuBar); #endif ??? //添加菜單響應函數 ??? connect(pActionTest,&QAction::triggered,this,&MainWindow::OnActionTest); ??? connect(pActionTest1,&QAction::triggered,this,&MainWindow::OnActionTest); } //菜單響應函數 void MainWindow::OnActionTest() { ??? QDialog ?dlg; ??? dlg.setWindowTitle("測試菜單響應"); ??? dlg.exec(); } void MainWindow::OnActionTest1() { ??? QDialog dlg; ??? dlg.setWindowTitle("測試菜單響應"); ??? dlg.exec(); } MainWindow::~MainWindow() { ??? delete ui; } |
上面的代碼中定義了兩種創建系統菜單的方式:調用QMainWindow自帶的菜單欄和自己新建菜單欄,由第6行定義的宏控制,顯示效果相同。
第25行為“測試”子菜單添加快捷鍵,當窗口獲得焦點時按alt+n可展開“測試”子菜單。
第31行為“測試”子菜單“測試”菜單項添加快捷鍵,當“測試”子菜單彈出后按‘s’鍵,程序即可做出響應。
第33行為“測試”子菜單的“測試2”菜單項添加了圖標。
第44行為“測試”子菜單的“測試2”和“測試3”之間添加了分割線。
使用UI設計器設計系統菜單
1、添加菜單項
直接輸入菜單項名稱,然后回車即可。
2、為菜單項設置圖標
在動作編輯器上,右鍵選擇編輯,然后添加圖標
如果想在圖標欄添加該菜單的快捷圖標,直接將該動作項拖放只圖標欄即可。
3、事件響應函數
我們的對象名稱為:actionOpenFile,默認情況我們只需要添加槽函數:
public slots:
??? void on_actionOpenFile_triggered();
當菜單被點擊時,該事件將出發,槽函數命名規則為:on_對象名稱_triggered,如果你覺得這個名字太長,可以自定義槽函數,然后通過connect進行連接:
connect(ui.actionOpenFile,? SIGNAL(triggered()), this, SLOT(OnActionOpenFile()));
進入“設計”頁面,進入如下圖所示的界面,具體操作方法見如下兩張圖,注意:輸入菜單名稱后一定要按“Enter”鍵才能生效。
注意: 子菜單可能無法輸入中文,可在Action Editor 中修改文本與提示信息