Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

Qt创建菜单栏

本篇博文讲菜单栏的创建以及添加子菜单和选项(我也不知道这个翻译成什么好,请原谅野生自学者的学识浅薄)。
先说下我的开发环境,我的操作系统是Arch Linux,使用的桌面是KDE,Qt版本是5.9.9。
那么首先是创建菜单,这里我们需要一个继承了QMainWindow类的类,这里我是用Qt Creator创建的QMainWindow项目。
那么这是我用Qt Creator创建的项目的源码(此时我仅仅在代码里加了些注释以便读者区分是哪些文件),我在创建的时候并没有选择生成form(即UI文件)。
这是生成的项目文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# untitled4.pro
QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
main.cpp \
mainwindow.cpp

HEADERS += \
mainwindow.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

这是头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// mainwindow.cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
};
#endif // MAINWINDOW_H

这是生成的cpp文件:

1
2
3
4
5
6
7
8
9
10
11
12
// mainwindow.cpp
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
}

MainWindow::~MainWindow()
{
}

这是生成的main.cpp文件:

1
2
3
4
5
6
7
8
9
10
11
12
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

创建菜单栏

好了,在开始之前我们先运行代码,看看QMainWindow裸奔起来是什么样子:

周围蓝色的是我的窗口装饰,与咱运行的QMainWindow无关。
那么接下来创建菜单。先声明一下,由于我的输入法唤起快捷键与Qt Creator的某快捷键冲突,所以注释我就用英文写了。
修改mainwindow.cpp文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// set window size
resize(500, 500);
// create menu
QMenuBar* qmb_p = menuBar();
// add menu
QMenu* file_p = qmb_p -> addMenu("File");
}

MainWindow::~MainWindow()
{
}

可以看到,我包含了QMenuBar和QMenu这两个库。这里说一下menuBar(),它返回一个QMenuBar类型的指针。想要了解更多的细节请看Qt的帮助文档。
然后就是qmb_p -> addMenu(“File”)了,它添加了一个叫做File的子菜单,其中addMenu()返回了一个QMenu类型的指针。
这里是运行效果:

添加选项

然后我们可以给子菜单里添加选项(即Action),依然修改mainwindow.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// set window size
resize(500, 500);
// create menu
QMenuBar* qmb_p = menuBar();
// add menu
QMenu* file_p = qmb_p -> addMenu("File");
//add action
QAction* new_p = file_p -> addAction("New");
}

MainWindow::~MainWindow()
{
}

这里我导入了QAction库,调用了file_p的addAction()成员函数并将其赋值给了new_p。addAction返回一个QAction类型的指针。addAction添加了一个Action(我个人称其为选项)。
这是运行结果(由于我不想做GIF,所以这是单击子菜单”File”后的结果):

可以看到,”File”子菜单下有了一个Action(选项)。
可以添加多个Menu和多个Action,本来想要一一展示的,但是由于现在已经22:11了,待会儿还要写状态栏,于是我就不写了,读者知道可以添加多个就行。

那么本篇完,我要开始写下一篇了这一篇我居然写了一个多小时,果然我语言组织能力不行。

评论



愿火焰指引你