本篇介绍Qt菜单栏相关操作,分为三部分:1.菜单栏相关的类介绍;2.系统菜单的生成和响应;3.弹出菜单的生成和响应;菜单栏通常只有以QMainWindow为基类的程序中才用到,以QWidget为基类的程序通常没有菜单栏。

1. 菜单相关类

  QMenuBar --菜单栏类,即下图中红色区域标记,菜单栏类给窗口提供水平菜单栏,此菜单栏占用窗口上方区域,垂直高度不变,水平宽度为窗口宽度,可随窗口大小变化而变化。如下图中“测试”,“test1”,"test2"所在的栏几位QMenuBar

  QMenu --菜单项,即下图中绿色区域,下图中“测试”,"test1","test2"都是一个独立的菜单,包含各个子菜单。QMenu还可以用来创建弹出菜单

  QAction --子菜单,即下图中蓝色区域标记的内容,一个子菜单对应一个操作。

2.系统菜单的生成和响应

2.1.使用代码添加系统菜单

示例源码:

.h文件

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 #include <QMenuBar>
 6 
 7 QT_BEGIN_NAMESPACE
 8 namespace Ui { class MainWindow; }
 9 QT_END_NAMESPACE
10 
11 class MainWindow : public QMainWindow
12 {
13     Q_OBJECT
14 
15 public:
16     MainWindow(QWidget *parent = nullptr);
17     ~MainWindow();
18 
19     //菜单栏
20     QMenuBar *pMenuBar;
21     //菜单项
22     QMenu *pMenuTest;
23     QMenu *pMenuTest1;
24     QMenu *pMenuTest2;
25     //子菜单
26     QAction *pActionTest;
27     QAction *pActionTest1;
28     QAction *pActionTest2;
29     QAction *pActionTest3;
30     QAction *pActionTest4;
31     QAction *pActionTest5;
32     QAction *pActionTest6;
33 
34 public slots:
35     //菜单响应函数
36     void OnActionTest();
37     void OnActionTest1();
38 
39 private:
40     Ui::MainWindow *ui;
41 };
42 #endif // MAINWINDOW_H

.cpp文件

 

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 #include <QDialog>
 4 
 5 //是否启用QMainWindow自带的菜单栏
 6 //#define USE_DEFAULT_MENU_BAR
 7 
 8 MainWindow::MainWindow(QWidget *parent)
 9     : QMainWindow(parent)
10     , ui(new Ui::MainWindow)
11 {
12     ui->setupUi(this);
13 
14     //指定菜单栏
15 #ifdef USE_DEFAULT_MENU_BAR
16     //添加菜单栏(此处添加为的为QMainWindow自带的菜单)
17     pMenuBar = this->menuBar();
18 #else
19     //添加自定义菜单
20     pMenuBar = new QMenuBar(this);
21 #endif
22 
23     //定义菜单项
24     //(&n)代表快捷方式,当窗口获得焦点时按alt+n即可打开“测试”菜单项
25     pMenuTest = new QMenu("测试(&n)",this);
26     pMenuTest1 = new QMenu("test1",this);
27     pMenuTest2 = new QMenu("test2",this);
28 
29     //定义子菜单
30     //(&s)为子菜单快捷键,当打开该菜单项后,按下‘s’键即可响应
31     pActionTest = new QAction("测试(&s)",this);
32     //新建一个带图标的菜单项,图标使用资源文件中的资源
33     pActionTest1 = new QAction(QIcon(":/new/prefix1/resource/soccer_ball.ico"),"测试1",this);
34     pActionTest2 = new QAction("测试2",this);
35     pActionTest3 = new QAction("测试3(&Y)",this);
36     pActionTest4 = new QAction("测试4",this);
37     pActionTest5 = new QAction("测试5(&M)",this);
38     pActionTest6 = new QAction("测试6",this);
39 
40     //将菜单项添加到子菜单
41     pMenuTest->addAction(pActionTest);
42     pMenuTest->addAction(pActionTest1);
43     //在菜单项之间添加分割线
44     pMenuTest->addSeparator();
45     pMenuTest->addAction(pActionTest2);
46 
47     pMenuTest1->addAction(pActionTest3);
48     pMenuTest1->addAction(pActionTest4);
49 
50     pMenuTest2->addAction(pActionTest5);
51     pMenuTest2->addAction(pActionTest6);
52 
53     //将子菜单添加到菜单栏
54     pMenuBar->addMenu(pMenuTest);
55     pMenuBar->addMenu(pMenuTest1);
56     pMenuBar->addMenu(pMenuTest2);
57 
58 #ifndef USE_DEFAULT_MENU_BAR
59     //当不使用QMainWindow自带的菜单栏时,必须要加上此行
60     setMenuBar(pMenuBar);
61 #endif
62 
63     //添加菜单响应函数
64     connect(pActionTest,&QAction::triggered,this,&MainWindow::OnActionTest);
65     connect(pActionTest1,&QAction::triggered,this,&MainWindow::OnActionTest);
66 }
67 
68 
69 //菜单响应函数
70 void MainWindow::OnActionTest()
71 {
72     QDialog dlg;
73     dlg.setWindowTitle("测试菜单响应");
74     dlg.exec();
75 }
76 
77 void MainWindow::OnActionTest1()
78 {
79 
80     QDialog dlg;
81     dlg.setWindowTitle("测试菜单响应");
82     dlg.exec();
83 }
84 
85 MainWindow::~MainWindow()
86 {
87     delete ui;
88 }

 

  上面的代码中定义了两种创建系统菜单的方式:调用QMainWindow自带的菜单栏和自己新建菜单栏,由第6行定义的宏控制,显示效果相同。

  第25行为“测试”子菜单添加快捷键,当窗口获得焦点时按alt+n可展开“测试”子菜单。

  第31行为“测试”子菜单“测试”菜单项添加快捷键,当“测试”子菜单弹出后按‘s’键,程序即可做出响应。

  第33行为“测试”子菜单的“测试2”菜单项添加了图标。

  第44行为“测试”子菜单的“测试2”和“测试3”之间添加了分割线。

2.2.使用UI设计器设计系统菜单

  进入“设计”页面,进入如下图所示的界面,具体操作方法见如下两张图,注意:输入菜单名称后一定要按“Enter”键才能生效

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/kyzc/p/11962903.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!