Qt --- Qt窗口

devtools/2024/9/29 17:13:41/

一、前言

前面学习的所有代码,都是基于QWidget控件。QWidget更多的是作为别的窗口的一个部分。

Qt中的QMainWindow就是窗口的完全体

Menu Bar菜单栏

Tool Bar Area 工具栏,类似于菜单栏,工具栏本质上就是把菜单中的一些比较常用的选项,直接放到工具栏里了,直接点工具栏中的按钮就能快速生效。

Dock Widget Area 铆接部件,就是一个子窗口。

Central Widget 中央控件,窗口最核心的部分。

Status Bar 状态栏。

二、菜单栏的使用

一个主窗口最多只有一个菜单栏,工具栏本质上就是菜单中的一些选项的快捷方式

菜单栏(QMenuBar) -》菜单(QMenu) -》菜单项(QAction)

图形化界面的创建

代码创建

如何让我们的菜单项有反应,被点击的时候会触发一个信号,triggered信号触发。

1、菜单添加快捷键

给菜单和菜单像设置快捷键,设置好的快捷键就可以搭配alt来使用了。

通过给文本中添加&F这样的操作,就是添加了快捷键alt+F。

代码:

给QAction添加快捷键

代码: 

2、添加子菜单:

菜单栏 -》菜单 -》子菜单 -》子菜单,QMenu也提供了addMenu,通过这个操作给某个菜单添加子菜单。

代码:

添加分割线和添加图标

菜单里菜单项特别多,就可以通过分割线进行分组

QMenu中提供了addSeparator这样的函数。来添加分割线

代码:

添加图标:

代码:qrc,用到QIcon类。

如果给QMenu设置图标,当前QMenu是长在QMenuBar上的,此时文本就不显示。图标覆盖了文本,QMenu是子菜单,图标和文本是都能显示的。

QMenuBar创建方式的讨论。

之前程序自己已经创建好了一个QMenuBar当前设置新的QMenuBar进来的时候,就会导致旧的QMenuBar脱离了Qt的对象树了,意味着后续就无法对这个对象进行释放了。

上述程序如果窗口关闭,对象树释放,此时进程也就节数了,进程结束,自然所有内存都回收给系统了,上述内存泄露也不会造成影响。但是如果这样的代码时出现在一个多窗口的程序中。如果涉及到窗口的频繁跳转切换,上述内存泄露就会更严重一些,但是实际上由于现在的计算机内存都比较充裕,上述内存泄露都还好,当然即使这样,我们也希望代码要规范一些。

如果QMenuBar已经存在,直接获取并返回。

如果QMenuBar不存在,就先创建一个新的,再返回。如果获取到已经存在的QMenuBar,这里的设置就是自己替换自己,还是自己,仍然在对象树上。

工作中可能会参与一些嵌入式的开发,嵌入式设备具有的硬件资源就比较紧张了。

三、QToolBar的使用

工具栏就是应用程序中集成各种功能实现快捷键使用的一个区域,可以有多个也可以没忽悠。

Qt中使用QToolBar表示工具栏对象。工具栏往往也可以手动移动位置。

代码:

之前设置的文字不会被删除,会变成一个ToolTip,另外也可以手动设置这里的toolTip

工具栏往往也是和菜单栏搭配使用的。工具栏中的QAction也可以出现在菜单中

如果一个QAction既是QMenu的子元素,又是QToolBar的子元素释放的时候,不会重复delete。

创建多个工具栏

代码:

设置工具栏出现的初始位置:

允许提放到哪些边缘:setAllowedAreas方法

设置不允许浮动

设置不允许移动

四、QStatusBar的使用

它是一个状态栏

代码:

给状态栏中添加子控件

五、QDockWidget的基本使用

浮动窗口 =》子窗口。Qt中使用QDockWidget来实现

六、Qt中的对话框

打开某些网站,不经意间就会弹出各种奇奇怪怪的窗口。对话框往往用户和用户之间进行短平快的操作。Qt中使用QDialog类表示对话框。针对一个已有的项目,也可以创建一些类,继承自QDia-log,实现咱们自定义的对话框。

Qt内置的对话框有:QFiledialog,QColorDialog,QFontDialog,QInputDialog和QMessageBox对话框。总体来说,基于QDialog作为父类创建出来的程序窗口和之前通过QWidget创建出来的非常相似。

 实际开发中,更多的情况,往往不是直接在创建项目的时候继承自QDialog,而是在代码中,创建额外的类,让额外的类继承自QDialog,主窗口,一般不会作为一个对话框,主窗口可以再产生一些其他的对话框。

代码:主窗口中,点击按钮弹出一个对话框。  

QDialog其实也是QWidget的一个子类,QWidget的各种属性方法,QDialog也能使用。

不同于界面上的其他控件,此处QDialog每次按下按钮,就会创建一个新的QDialog对象并进行显示。一个程序运行过程中,可以无数次点击这个按钮,进一步就产生出无数个这样的对象了=》内存泄露。就怕你的这一个对象占用内存很多呢,你的机器本身剩余的内存很少呢。正确的做法,应该是让用户点击对话框关闭按钮的时候才进行delete操作。

要想自定义对话框,就需要继承自QDialog创建类。

1)纯代码的方式来自定义对话框

2)通过图形化来自定义对话框

关键操作是创建一个ui文件

   

model 属性,是一个bool值,模态/非模态。

模态:弹出对话框的时候,此时用户无法操作父窗口,必须得完成对话框内部出的操作,关闭对话框之后。

非模态:弹出对话框的时候,用户可以操作父窗口。前面写的几个代码,都是非模态对话框

把show改成exec就可以改编成模态对话框。

QMessageBox的使用

QMessageBox用来显示一个消息给用户,并且让用户进行一个简单的选择。

代码:

添加自定义按钮

快速创建QMessageBox对话框

QColorDialog的使用

内置了调色板的功能

Qt中的QColorDialog的功能就是内置了调色板,效果就和上述的调色板相似。

getColor这个函数就能够弹出一个模态对话框,用户选择颜色之后,点击确定,对话框关闭,getColor返回的值就是用户选择的颜色值。它是一个静态函数,不必创建对话框对象,就可以直接使用。

代码:

通过ARGB来展示的。

alpha就是不透明度(opacity)

使用 0 - 1这样的小数表示RGB的值,1就对应到整数的255,0就对应到整数的0。

QFileDialog的使用

通过QFileDialog可以选择一个文件,能够获取到这个文件的路径,打开文件/保存文件

 代码:

此处的打开/保存这里的功能都是需要额外去实现的。并不是说直接一按保存就真的保存了。Qt针对文件的操作。

QFontDialog的使用

字体对话框类

当用户再这里设置好了属性并且点击ok的是函数就会返回一个QFont对象。

把用户选择的字体,设置到按钮上

QInputDialog的使用

输入对话框,请用户输入一个具体的数据,可以是整数,可以是浮点数,还可以是字符串,QInputDialog提供了几个静态函数getDouble,getInt,getItem

代码:

小结

Qt窗口程序

1、菜单栏(QMenuBar) =》 菜单(QMenu) =》 菜单项(QAction)

2、工具栏(QToolBar) =》菜单项(QAction)

3、子窗口(QDockWidget)=》QWidget =》放置其他的控件

4、状态栏(QStatusBar)=》QWidget

5、对话框(QDialog)=》自己手动继承的方式,针对QDialog进行扩展。

QMessageBox、QFileDialog、QColorDialog、QFontDialog、QInputDialog。

得到了更完整的应用程序。


http://www.ppmy.cn/devtools/118792.html

相关文章

10.1软件工程知识详解上

软件工程概述 软件开发生命周期 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成…

初始docker以及docker的基本使用!!!

文章目录 虚拟化技术Docker/podman 命令通用命令查看docker 当前版本管理docker运行 镜像操作[image]列出本地所有镜像拉取镜像删除镜像把docker中的镜像打包成文件把镜像文件加载到docker中上传镜像 容器操作[container]创建容器docker run的参数选项列出所有容器启动容器停止…

递归手撕,JSON 字符串化和解析,加权树结构的字符串解析对象,解析并返回DOM 树结构(DOMParser),解析带有层级的文本

目录 1 JSON 字符串化和解析 2 加权树结构的字符串解析对象 3. 解析并返回DOM 树结构 4. 解析带有层级的文本 1 JSON 字符串化和解析 // <!-- 实现一个函数&#xff0c;能够将自定义格式的字符串转换为 JSON 对象。 // 例如&#xff0c;给定字符串 name: "A…

大模型训练技术:使用QLM提升Qwen2-7B 128k训练效率3.4倍

大模型训练技术&#xff1a;使用QLM提升Qwen2-7B 128k训练效率3.4倍 原创 一、引言 自Transformer架构问世以来&#xff0c;大模型领域的进展如火如荼&#xff0c;短短几年内&#xff0c;模型参数规模已攀升至天文数字&#xff0c;轻松跨过万亿门槛。面对如此庞然大物&#…

物理学基础精解【24】

文章目录 行列式行列式的主要性质行列式按行展开逆序对换行列式计算中的应用逆序的定义逆序在行列式中的应用例子逆序在行列式计算中的作用例子例题逆序在行列式计算中起着决定性作用例子说明 逆序在行列式计算中起着至关重要的作用确定行列式每项符号计算行列式值的基础应用实…

二叉树之堆树

堆树是一种完全二叉树&#xff0c;完全二叉树特点&#xff1a;除了最后一层所有层都填满&#xff0c;最后一层节点从左到右排列。堆树分为两种类型&#xff1a;大顶堆和小顶堆。 大顶堆&#xff1a;每个节点的值都大于或等于其子节点的值&#xff0c;根节点是最大值。 小顶堆…

ACM第三次考核题解

ACM第三次考核题解 题目序号难度题目编号题目考察知识点1签到题A这是一道很难的题&#xff01;&#xff01;&#xff01;输出2迷之难度F神说要有光&#xff0c;于是有了手电筒贪心3简单BThis is a real English problem&#xff01;思维 英语4简单C玩具简单排序5简单I“近义词…

Python库matplotlib之二

Python库matplotlib之二 figureAxessubplot figure matplotlib.pyplot.figure(numNone, figsizeNone, dpiNone, facecolorNone, edgecolorNone, frameonTrue, FigureClass<class ‘matplotlib.figure.Figure’>, clearFalse, **kwargs) num&#xff0c;int 或 str 或 fi…