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中添加一个控件

例:

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

相关推荐
Cao1234567893217 分钟前
简易学生成绩管理系统(C语言)
c语言·开发语言
The Future is mine9 分钟前
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
开发语言·c#
亿坊电商12 分钟前
PHP框架在微服务迁移中能发挥什么作用?
开发语言·微服务·php
烁34712 分钟前
每日一题(小白)模拟娱乐篇33
java·开发语言·算法
坐吃山猪31 分钟前
Python-Agent调用多个Server-FastAPI版本
开发语言·python·fastapi
88号技师32 分钟前
【1区SCI】Fusion entropy融合熵,多尺度,复合多尺度、时移多尺度、层次 + 故障识别、诊断-matlab代码
开发语言·机器学习·matlab·时序分析·故障诊断·信息熵·特征提取
北漂老男孩1 小时前
Java对象转换的多种实现方式
java·开发语言
未来可期LJ1 小时前
【Test】单例模式❗
开发语言·c++
Arenaschi1 小时前
SQLite 是什么?
开发语言·网络·python·网络协议·tcp/ip
听雨·眠1 小时前
go语言中defer使用指南
开发语言·后端·golang