当前位置:网站首页>QT 菜单栏、工具栏和状态栏
QT 菜单栏、工具栏和状态栏
2022-07-27 04:42:00 【PHP代码】
在之前的《添加动作》一文中,我们已经了解了,Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示。QAction可以添加到菜单上、工具栏上。期间,我们还详细介绍了一些细节问题,比如资源文件的使用、对象模型以及布局管理器。这一节则是详细介绍关于菜单栏、工具栏以及状态栏的相关内容。
我们假设窗口还是建立在QMainWindow类之上,这会让我们的开发简单许多。当然,在实际开发过程中,QMainWindow通常只作为“主窗口”,对话框窗口则更多地使用QDialog类。我们会在后面看到,QDialog类会缺少一些QMainWindow类提供方便的函数,比如menuBar()以及toolBar()。
下面还是回到《添加动作》一文中的代码片段:
openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));
connect(openAction, &QAction::triggered, this, MainWindow::open);
QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
我们看到,使用menuBar()函数,Qt 为我们创建了一个菜单栏。menuBar()是QMainWindow提供的函数,因此你是不会在QWidget或者QDialog中找到它的。这个函数会返回窗口的菜单栏,如果没有菜单栏则会新创建一个。这也就解释了,为什么我们可以直接使用menuBar()函数的返回值,毕竟我们并没有创建一个菜单栏对象啊!原来,这就是menuBar()为我们创建好并且返回了的。
Qt 中,表示菜单的类是QMenuBar(你应该已经想到这个名字了)。QMenuBar代表的是窗口最上方的一条菜单栏。我们使用其addMenu()函数为其添加菜单。尽管我们只是提供了一个字符串作为参数,但是 Qt 为将其作为新创建的菜单的文本显示出来。至于 & 符号,我们已经解释过,这可以为菜单创建一个快捷键。当我们创建出来了菜单对象时,就可以把QAction添加到这个菜单上面,也就是addAction()函数的作用。
下面的QToolBar部分非常类似。顾名思义,QToolBar就是工具栏。我们使用的是addToolBar()函数添加新的工具栏。为什么前面一个是menuBar()而现在的是addToolBar()呢?因为一个窗口只有一个菜单栏,但是却可能有多个工具栏。如果我们将代码修改一下:
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
QToolBar *toolBar2 = addToolBar(tr("Tool Bar 2"));
toolBar2->addAction(openAction);
我们看到,现在有两个工具栏了:

工具栏可以设置成固定的、浮动的等等,具体设置可以参考 Qt 文档。
前面我们说过,使用QAction::setStatusTip()可以设置该动作在状态栏上的提示文本。但我们现在把鼠标放在按钮上,是看不到这个提示文本的。原因很简单,我们没有添加一个状态栏。怎么添加呢?类似前面的QMainWindow::menuBar(),QMainWindow有一个statusBar()函数。让我们把这个函数添加上去:
QToolBar *toolBar2 = addToolBar(tr("Tool Bar 2"));
toolBar2->addAction(openAction);
statusBar();
然后编译运行一下:

我们添加了一个孤零零的statuBar()显得不伦不类,但是,同前面的menuBar()的实现类似,这个函数会返回一个QStatusBar对象,如果没有则先创建再返回。
QStatusBar继承了QWidget,因此,我们可以将其它任意QWidget子类添加到状态栏,从而实现类似 Photoshop 窗口底部那种有比例显示、有网格开关的复杂状态栏。有关QStatusBar的更多信息,请参考 Qt 文档。
对于没有这些函数的QDialog或者QWidget怎么做呢?要记得,QToolBar以及QStatusBar都是QWidget的子类,因此我们就可以将其结合布局管理器添加到另外的QWidget上面。QLayout布局提供了setMenuBar()函数,可以方便的添加菜单栏。具体细节还是详见文档。
至此,我们已经将组成窗口元素介绍过一遍。结合这些元素以及布局管理,我们就应该可以实现一个简单的通用的窗口。当我们完成窗口布局之后,我们就可以考虑向其中添加功能。这就是我们后面章节的内容。
边栏推荐
- How does novice Xiaobai learn to be we media?
- Solution to the third game of 2022 Hangzhou Electric Multi school league
- Sunset red warm tone tinting filter LUTS preset sunset LUTS 1
- What about PS too laggy? A few steps to help you solve the problem
- Knapsack problem DP
- 日落红暖色调调色滤镜luts预设Sunset LUTs 1
- 【搜索】Flood Fill 和 最短路模型
- CDH cluster integration external Flink (improved version - keep pace with the times)
- 打开编程的大门
- 网络协议详解:IP
猜你喜欢

2019强网杯upload

双向重发布实验

集成开发环境Pycharm的安装及模板设置

Photoshop提示暂存盘已满怎么办?ps暂存盘已满如何解决?

有趣的C语言

Photoshop裁剪工具隐藏技巧

C language - two dimensional array, pointer

How does PS import LUT presets? Photoshop import LUT color preset tutorial

Bubble sort (detailed)

Basic configuration of static routing to achieve network wide accessibility
随机推荐
【报错】:Cannot read properties of undefined (reading ‘prototype‘)
What about PS too laggy? A few steps to help you solve the problem
「Photoshop2021入门教程」对齐与分布制作波点图案
安装Pygame
Photoshop各历史版本回顾以及系统要求
【搜索】DFS之连通性模型 + 搜索顺序
二维数组求和 练习
CDH cluster integration external Flink (improved version - keep pace with the times)
【搜索】双向广搜 + A*
Shift right of negative numbers
一道数学题,让芯片巨头亏了5亿美金
TCP's three handshakes and four waves
Photoshop提示暂存盘已满怎么办?ps暂存盘已满如何解决?
再一个技巧,每月稳赚3万+
写代码涉及到的斜杠/和反斜杠\
Chapter 4 scope and life cycle of bean object
【C语言】自定义类型详解(结构体+枚举+联合)
Final Cut Pro Chinese tutorial (1) basic understanding of Final Cut Pro
Comprehensive experiment of static routing
双向重发布实验