QT窗口相关控件及其属性
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中添加一个控件
例:
同样可以对浮动窗口可以停靠的位置进行设置
总结
Qt窗口程序所能包含的:
1.菜单栏(QMenuBar)->菜单(QMenu)->菜单项(QAction)
2.工具栏(QToolBar)->菜单项(QAction)
3.子窗口(QDockWidget)->QWidget->放置其它控件
4.状态栏(QStatusBar)->放置其它控件
5.对话框(QDialog)->通过手动继承的方式进行自定义,添加控件