widget,PushButton,lineEdit等都是基于QWidget延展出来的
并不是完整的窗口,而是作为窗口的一部分
真正的窗口是QMainWindow

菜单栏
Qt中的菜单栏是通过QMenuBar这个类来实现的,一个主窗口最多只有一个菜单栏,位于主窗口顶部,主窗口标题栏下面。
菜单栏中包含菜单,菜单中包含菜单项
如:

例:
创建QMainWindow文件

QMainWindow的ui文件中的对象树和QWidget文件对象树不同

自带中央控件,菜单栏,状态栏
在左上角输入是创建新的菜单QMenu

在已经创建号的菜单进行输入是创建菜单项QAction

但是发现在创建菜单项时无法输入中文,可以在其它位置输入中文后粘贴到此处进行创建,可以在对象树进行菜单,菜单项的移除

使用代码创建菜单结构

实现菜单项的槽函数
但是此时点击菜单项无反应,可以通过triggered---触发来实现
当点击QAction时会触发一个信号---triggered触发
通过设置triggered的槽函数来实现点击QAction时,执行对应操作
在MinWindow.h文件中声明槽函数

在cpp文件中进行connect

进行槽函数的定义

在次运行程序后,点击文件菜单下的添加文件菜单项可以在输出窗口进行debug输出
还可以给菜单,菜单项添加快捷键
设置快捷键搭配alt使用
实现菜单和菜单项的快捷键
在创建菜单和菜单项时,给其内文本加上(&字母),就可以通过alt+字母进行快捷访问,也可以通过创建QShortCut对象来实现快捷键
例:

就可以通过长按alt,按f,按n在输入框输出debug内容
添加子菜单
菜单栏--->菜单--->子菜单---->菜单项
通过QMenu提过的addMenu来在菜单内添加菜单,实现子菜单
例:

通过将鼠标悬停在箭头上展开子菜单

添加分隔线
分割线用于对菜单里的菜单项进行分组---通过QMenu提供的addSeparator实现
例:

给菜单添加图标
使用QIcon类,通过qrc机制引入图片

导入图片后通过QAction的setIcon进行图片设置

如果给QMenu设置图标,那么就会将文本遮盖
如:
注意事项---MenuBar的内存泄漏
在通过代码创建菜单栏时,是通过

方式创建
但是若是在创建项目时,没有勾选自动生成ui文件程序才正常运行
如果勾选了自动生成ui文件,则会造成内存泄漏,因为Qt自动生成了一个QMenuBar---在创建QMainWindow文件时自动生成一个menubar和statuebar
在代码中创建新的menubar设置进mainwindow时,导致旧的menubar脱离Qt的对象树,在后续程序结束时无法自动释放
解决方法:如果menubar已经存在就获取,如果不存在就创建

工具栏
QToolBar----工具栏是应用程序中集成各种功能事项快捷键使用的一个区域,可以有多个,也可以没有----默认没有,需要手动创建。可以将工具栏进行手动移动位置
添加工具栏使用的是addToolbar,而不是set,而菜单栏的添加使用的是setMenubar,因为菜单栏只能有一个,而工具栏可以有多个
例:

给工具栏添加菜单项

实现工具栏中菜单项
在头文件声明槽函数

在构造函数进行信号槽绑定

实现槽函数

点击工具栏对应选项实现debug输出
实现工具栏中的菜单项的图标
通过qrc机制引入图片

将图标设置进工具栏中的菜单项

文本被图标覆盖掉
但是若将鼠标停留在工具上,会给出在创建菜单项时设置的文本作为提示

也可以手动设置tooltip

QAction重复释放问题
QAction既可以添加到QMenu,同时也可以添加到QToolBar,当一个QAction同时出现在QMenu和QToolBar时,若在其中一个被删除,不会造成重复释放,释放一个QAction内存后,不会在另一个菜单被释放
创建多个工具栏
基础效果

默认情况下,两个工具栏都在对顶层的同一行
可以通过拖拽工具栏头部的点进行移动工具栏

MainWindow提供addToolBar在添加工具栏时设置工具栏初始位置
相关选项
|-----------------------|----------|
| 选项 | 说明 |
| Qt::LeftToolBarArea | 停靠在左侧 |
| Qt::RightToolBarArea | 停靠在右侧 |
| Qt::TopToolBarArea | 停靠在顶部 |
| Qt::BottomToolBarArea | 停靠在底部 |
| Qt::AllToolBarAreas | 四个位置都能停靠 |
如:

QToolBar还提供setAllowedAreas来设置运行停靠的位置
设置后就只能停靠在左右,若拖动到上下边缘则会悬浮

也可以设置ToolBar不允许浮动---setFloatable(bool)

设置后就不能悬浮在窗口中,只能停靠在边缘
还可以设置不允许移动---setMoveabel(bool)

就无法拖动ToolBar
状态栏
状态栏是应用程序中输出简要信息的区域。一般位于主窗口最底部,一个窗口最多只能有一个状态栏。
在Qt中状态栏是通过QStatusBar类实现
在状态栏中可以显示的消息类型有:
实时消息:如当前程序状态,鼠标位置
永久消息:如程序版本号
进度消息:如进度条提示,版本消息
同样,在勾选了自动生成ui文件的情况下,默认就生成了一个statusbar,在代码进行使用时直接获取,如果没有才进行创建,避免内存泄漏
例:
设置临时消息----showMessage()

可以在添加临时消息时设置显示时间,单位为毫秒

当达到时间后,临时消息会自动消失
在状态栏中添加子控件

若存在showMessage则不会显示子控件,因为showMessage会将子控件覆盖
也可以添加多个子控件

在状态栏中添加状态条
状态条---QProgressBar

浮动窗口
浮动窗口---QDockWidget
通过addDockWidget将浮动窗口添加到当前窗口内,第一个参数为添加到当前窗口的位置
如:
Qt::LeftDockWidgetArea 放到左侧
Qt::RightDockWidgetArea 放到右侧
Qt::TopDockWidgetArea 放到顶部
Qt::BottomDockWidgetArea 放到底部
双击浮动窗口进行展开

给浮动窗口添加控件
不能直接将控件添加到浮动窗口中,而是要先创建一个QWidget,设置一个布局管理器,将要添加的控件,放到布局管理器中,再将QWidget设置到dockWidget中,否则就只能项dockWidget中添加一个控件
例:

同样可以对浮动窗口可以停靠的位置进行设置
